﻿Imports System
Imports System.Drawing
Imports System.ComponentModel

#Region "列挙体"

#Region "描写系"
''' <summary>既定されたVBカラー(ARGB型)</summary> 
Public Enum ColorConstants As Integer
''' <summary>黒</summary> 
    vbBlack = &HFF000000
''' <summary>青</summary> 
    vbBlue = &HFF0000FF
''' <summary>緑</summary> 
    vbGreen = &HFF00FF00
''' <summary>シアン</summary> 
    vbCyan = &HFF00FFFF
''' <summary>赤</summary> 
    vbRed = &HFFFF0000
''' <summary>マゼンタ</summary> 
    vbMagenta = &HFFFF00FF
''' <summary>黄</summary> 
    vbYellow = &HFFFFFF00
''' <summary>白</summary> 
    vbWhite = &HFFFFFFFF
End Enum

''' <summary>線のスタイル</summary> 
Public Enum DrawStyleConstants
    ''' <summary>実線</summary> 
    vbSolid
    ''' <summary>ダッシュで構成される直線</summary> 
    vbDash
    ''' <summary>ドットで構成される直線</summary> 
    vbDot
    ''' <summary>ダッシュとドットの繰り返しパターンで構成される直線</summary> 
    vbDashDot
    ''' <summary>ダッシュと 2 つのドットの繰り返しパターンで構成される直線</summary> 
    vbDashDotDot
End Enum

''' <summary>グラフィックススタイル</summary>
<Microsoft.VisualBasic.HideModuleNameAttribute()> _
Public Module GraphicsStyle
    ''' <summary>直線を描くときのスタイル</summary>
    Public Enum LineStyle
        ''' <summary>直線</summary>
        Line
        ''' <summary>長方形</summary>
        Rectangle
        ''' <summary>塗りつぶしの長方形</summary>
        FillRectangle
        ''' <summary>長方形</summary>
        B = Rectangle
        ''' <summary>塗りつぶしの長方形</summary>
        BF = FillRectangle
    End Enum

    ''' <summary>曲線を描くとのスタイル</summary>
    Public Enum CurveStyle
        ''' <summary>曲線</summary>
        Curve
        ''' <summary>閉じた曲線(FillStyleでは交互塗りつぶし)</summary>
        CloseAlternateCurve
        ''' <summary>閉じた曲線(FillStyleでは全域塗りつぶし)</summary>
        CloseWindingCurve
        ''' <summary>交互塗りつぶしの曲線</summary>
        FillAlternateCurve
        ''' <summary>全域塗りつぶしの曲線</summary>
        FillWindingCurve
    End Enum

    ''' <summary>円を描くとのスタイル</summary>
    Public Enum CircleStyle
        ''' <summary>円弧</summary>
        Arc
        ''' <summary>扇型</summary>
        Pie
        ''' <summary>塗りつぶしの扇型</summary>
        FillPie
    End Enum
End Module

''' <summary>塗りつぶしのスタイル</summary>
Public Enum FillStyleConstants
    ''' <summary>塗りつぶし</summary> 
    vbFSSolid
    ''' <summary>透明</summary> 
    vbFSTransparent
    ''' <summary>横線</summary> 
    vbHorizontalLine
    ''' <summary>縦線</summary> 
    vbVerticalLine
    ''' <summary>斜線(左上-右下)</summary>
    vbUpwardDiagonal
    ''' <summary>斜線(左下-右上)</summary>
    vbDownwardDiagonal
    ''' <summary>クロス</summary>
    vbCross
    ''' <summary>網掛け</summary>
    vbDiagonalCross
End Enum

''' <summary>ラスターオペレーション(画像合成の方法)</summary>
Public Enum RasterOpConstants As Long
    ''' <summary>ソースビットマップを、デスティネーションビットマップにコピー</summary>
    vbSrcCopy = &HCC0020
    ''' <summary>デスティネーションビットマップと、ソースビットマップのピクセルを合成(OR)</summary>
    vbSrcPaint = &HEE0086
    ''' <summary>デスティネーションビットマップと、ソースビットマップのピクセルを合成(AND)</summary>
    vbSrcAnd = &H8800C6
    ''' <summary>デスティネーションビットマップと、ソースビットマップのピクセルを合成(XOR)</summary>
    vbSrcInvert = &H660046
    ''' <summary>デスティネーションビットマップを反転させた結果と、ソースビットマップのピクセルを合成(AND)</summary>
    vbSrcErase = &H440328
    ''' <summary>ソースビットマップを反転させた結果を、デスティネーションビットマップにコピー</summary>
    vbNotSrcCopy = &H330008
    ''' <summary>デスティネーションビットマップと、ソースビットマップのピクセルを合成した結果を反転(OR)</summary>
    vbNotSrcErase = &H1100A6
    ''' <summary>パターンとソースビットマップを合成</summary>
    vbMergeCopy = &HC000CA
    ''' <summary>反転したソースビットマップをデスティネーションビットマップに合成(OR)</summary>
    vbMergePaint = &HBB0226
    ''' <summary>パターンをデスティネーションビットマップにコピー</summary>
    vbPatCopy = &HF00021L
    ''' <summary>デスティネーションビットマップをパターンと合成(OR)</summary>
    vbPatPaint = &HFB0A09L
    ''' <summary>反転したソースビットマップ/パターンをデスティネーションビットマップと合成(XOR)</summary>
    vbPatInvert = &H5A0049L
    ''' <summary>デスティネーションビットマップを反転</summary>
    vbDstInvert = &H550009
    ''' <summary>黒で塗りつぶす</summary>
    vbBlackness = &H42
    ''' <summary>白で塗りつぶす</summary>
    vbWhiteness = &HFF0062
End Enum
#End Region

#Region "その他"
''' <summary>仮想座標のモード</summary> 
Public Enum ScaleModeConstants
    ''' <summary>Scale～の設定を使う</summary> 
    vbUser
    ''' <summary>Twip (1 インチ当たり 1,440 twip、1 センチ当たり 567 twip)</summary> 
    vbTwips
    ''' <summary>ポイント (1 論理インチ当たり 72 ポイント)</summary> 
    vbPoints
    ''' <summary>ピクセル (モニタまたはプリンタの解像度の最小単位)</summary> 
    vbPixels
    ''' <summary>文字 (水平方向 = 1 単位当たり 120 twip、垂直方向 = 1 単位当たり 240 twip)</summary> 
    vbCharacters
    ''' <summary>インチ(dpiに依存)</summary> 
    vbInches
    ''' <summary>ミリメートル (mm)</summary> 
    vbMillimeters
    ''' <summary>センチメートル (cm)</summary> 
    vbCentimeters
    ''' <summary>HiMetric (1 単位当たり0.01mm)</summary> 
    VbHimetric
End Enum

Namespace AxialDirectionConstants
    ''' <summary>X軸の方向</summary>
    Public Enum XAxial
        ''' <summary>右</summary>
        Right
        ''' <summary>左</summary>
        Left
    End Enum

    ''' <summary>Y軸の方向</summary>
    Public Enum YAxial
        ''' <summary>下</summary>
        Bottom
        ''' <summary>上</summary>
        Top
    End Enum
End Namespace
#End Region

#End Region

#Region "Informationモジュール"

''' <summary>VB6.0のInformationの一部のモジュールを提供します。</summary>
''' <remarks>Information.QBColor(1) VB6.0のQBColor(1)と同等</remarks>
<Microsoft.VisualBasic.HideModuleNameAttribute()> _
Public Module Information

    ''' <summary>赤・緑・青それぞれの値から色を作る(ARGB形式)</summary>
    ''' <param name="Red">赤の強さ(0～255の範囲)</param>
    ''' <param name="Green">緑の強さ(0～255の範囲)</param>
    ''' <param name="Blue">青の強さ(0～255の範囲)</param>
    ''' <returns>取得した色(ColorConstants形式(ARGB形式))</returns>
    ''' <remarks>
    ''' <example>メソッドの使用例
    ''' <para>Information.RGB(100,100,100) VB6.0のRGB(100,100,100)と同等</para>
    ''' </example></remarks>
    Public Function RGB(ByVal Red As Byte, ByVal Green As Byte, ByVal Blue As Byte) As ColorConstants
        Return DirectCast((255 << 24) Or (CInt(Red) << 16) Or (CInt(Green) << 8) Or Blue, ColorConstants)
    End Function

    ''' <summary>アルファ・赤・緑・青それぞれの値から色を作る(ARGB形式)</summary>
    ''' <param name="Alpha">不透明度の強さ(0～255の範囲)</param>
    ''' <param name="Red">赤の強さ(0～255の範囲)</param>
    ''' <param name="Green">緑の強さ(0～255の範囲)</param>
    ''' <param name="Blue">青の強さ(0～255の範囲)</param>
    ''' <returns>取得した色(ColorConstants形式(ARGB形式))</returns>
    ''' <remarks>
    ''' <example>メソッドの使用例
    ''' <para>Information.ARGB(100,100,100,100) Color.FromArgb(100, 100, 100, 100).ToArgb()と同等(ただしARGB形式で扱う)</para>
    ''' </example></remarks>
    Public Function ARGB(ByVal Alpha As Byte, ByVal Red As Byte, ByVal Green As Byte, ByVal Blue As Byte) As ColorConstants
        Return DirectCast((CInt(Alpha) << 24) Or (CInt(Red) << 16) Or (CInt(Green) << 8) Or Blue, ColorConstants)
    End Function

    ''' <summary>アルファ・既定色そから不透明度を設定しなおして色を作る(ARGB形式)</summary>
    ''' <param name="Alpha">不透明度の強さ(0～255の範囲)</param>
    ''' <param name="BaseColor">ベースとなる既定色</param>
    ''' <returns>取得した色(ColorConstants形式(ARGB形式))</returns>
    ''' <remarks>
    ''' <example>メソッドの使用例
    ''' <para>Information.ARGB(100,ColorConstants.Black) Color.FromArgb(100, Color.Black).ToArgb()と同等(ただしARGB形式で扱う)</para>
    ''' </example></remarks>
    Public Function ARGB(ByVal Alpha As Byte, ByVal BaseColor As ColorConstants) As ColorConstants
        Color.FromArgb(100, Color.Black).ToArgb()
        Return DirectCast((CInt(Alpha) << 24) Or (&HFFFFFF And BaseColor), ColorConstants)
    End Function

    ''' <summary>あらかじめ決められた色を取得する(ARGB形式)</summary> 
    ''' <param name="VBColor">VB6.0の識別の整数(0～15) それ以外の範囲は透明色を返す</param> 
    ''' <returns>取得した色(ColorConstants形式(ARGB形式))</returns>
    ''' <remarks>
    ''' <example>メソッドの使用例 
    ''' <para>Information.QBColor(0) VB6.0のQBColor(0)と同等</para> 
    ''' </example></remarks>
    Public Function QBColor(ByVal VBColor As Integer) As ColorConstants
        Dim ARGB As Integer

        Select Case VBColor
            Case 0
                ARGB = &HFF000000
                Exit Select

            Case 1
                ARGB = &HFF000080
                Exit Select

            Case 2
                ARGB = &HFF008000
                Exit Select

            Case 3
                ARGB = &HFF008080
                Exit Select

            Case 4
                ARGB = &HFF800000
                Exit Select

            Case 5
                ARGB = &HFF800080
                Exit Select

            Case 6
                ARGB = &HFF808000
                Exit Select

            Case 7
                ARGB = &HFFC0C0C0
                Exit Select

            Case 8
                ARGB = &HFF808080
                Exit Select

            Case 9
                ARGB = &HFF0000FF
                Exit Select

            Case 10
                ARGB = &HFF00FF00
                Exit Select

            Case 11
                ARGB = &HFF00FFFF
                Exit Select

            Case 12
                ARGB = &HFFFF0000
                Exit Select

            Case 13
                ARGB = &HFFFF00FF
                Exit Select

            Case 14
                ARGB = &HFFFFFF00
                Exit Select

            Case 15
                ARGB = &HFFFFFFFF
                Exit Select

            Case Else
                ARGB = &H0
                Exit Select
        End Select

        Return DirectCast(ARGB, ColorConstants)
    End Function
End Module
#End Region

#Region "PictureBoxクラス"
''' <summary>VB6.0のPictureBoxとほぼ同等なPictureBox</summary>
''' <remarks>
''' クラスの利用方法(VB.NET)
''' <para>宣言と初期化　　　　：Dim A As VB60.PictureBox = New VB60.PictureBox()</para>
''' <para>座標軸の方向設定　　：A.YAxialDirection = AxialDirectionConstants.YAxial.Top等</para>
''' <para>仮想座標の設定　　　：A.Init_Scale(-1,1,2,2) →数学座標の-1～1の幅高さそれぞれ2の仮想座標の設定</para>
''' <para>使う前の最後の初期化：A.Starting_Init()</para>
''' <para>実際に使用する　　　：A.Line(X1,Y1,X2,Y2)等</para>
''' <para>外部から操作する　　：A.Interrupt()→外部操作→A.Interrupt()</para>
''' </remarks>
<ToolboxBitmap(GetType(PictureBox), "PictureBox.bmp"), System.ComponentModel.ToolboxItem(True), TypeConverter(GetType(ExpandableObjectConverter)), Description("VB6.0のPictureBoxとほぼ同等なPictureBoxを提供します。")> _
Public Class PictureBox
    Inherits System.Windows.Forms.PictureBox

#Region "フィールド"
    Private StartEnabledFlag As Boolean
    Private SW, SH, ST, SL As Single
    Private SM As ScaleModeConstants
    Private NowX, NowY As Single
    Private DrawCMode As System.Drawing.Drawing2D.CompositingMode
    Private DrawSMode As System.Drawing.Drawing2D.SmoothingMode
    Private FStyle As FillStyleConstants
    Private ARedraw As Boolean
    Private XAD As AxialDirectionConstants.XAxial
    Private YAD As AxialDirectionConstants.YAxial
    Private Converter As PictureBoxUnitConvert
    ''' <summary>描画対象=基底クラスのImageに代入</summary>
    Private ScaleImage As Bitmap
    ''' <summary>描画対象のGraphicsオブジェクト</summary>
    Private TargetGraphics As System.Drawing.Graphics
    ''' <summary>描画時に使うPen</summary>
    Private DrawPen As System.Drawing.Pen
    ''' <summary>塗りつぶし時に使うブラシ</summary>
    Private FillBrush As System.Drawing.Drawing2D.HatchBrush
#End Region

#Region "プロパティ"

#Region "仮想座標系"
    ''' <summary>仮想座標の幅(マイナスの値の場合はX軸の方向がLeftになる)</summary>
    <Category("仮想座標"), DefaultValue(100.0F), RefreshProperties(RefreshProperties.Repaint), Description("仮想座標の幅を入力・取得します。(マイナスの値の場合はX軸の方向がLeftになる)")> _
    Public Property ScaleWidth() As Single

        Get
            Return Me.SW
        End Get

        Set(ByVal value As Single)
            Me.SW = value
            Init_CurrentValue()
        End Set

    End Property

    ''' <summary>仮想座標の高さ(マイナスの値の場合はY軸の方向がTopになる)</summary>
    <Category("仮想座標"), DefaultValue(100.0F), RefreshProperties(RefreshProperties.Repaint), Description("仮想座標の高さの値を入力・取得します。(マイナスの値の場合はY軸の方向がTopになる)")> _
    Public Property ScaleHeight() As Single

        Get
            Return Me.SH
        End Get

        Set(ByVal value As Single)
            Me.SH = value
            Init_CurrentValue()
        End Set

    End Property

    ''' <summary>仮想座標の上端の値</summary>
    <Category("仮想座標"), DefaultValue(0.0F), RefreshProperties(RefreshProperties.Repaint), Description("仮想座標の上端の値を入力・取得します。")> _
    Public Property ScaleTop() As Single

        Get
            Return Me.ST
        End Get

        Set(ByVal value As Single)
            Me.ST = value
            Init_CurrentValue()
        End Set

    End Property

    ''' <summary>仮想座標の左端の値</summary>
    <Category("仮想座標"), DefaultValue(0.0F), RefreshProperties(RefreshProperties.Repaint), Description("仮想座標の左端の値を入力・取得します。")> _
    Public Property ScaleLeft() As Single

        Get
            Return Me.SL
        End Get

        Set(ByVal value As Single)
            Me.SL = value
            Init_CurrentValue()
        End Set

    End Property

    ''' <summary>X軸の方向(Xのプラス方向)</summary>
    <Category("仮想座標"), DefaultValue(AxialDirectionConstants.XAxial.Right), Description("仮想座標のX軸の方向(プラス側)をAxialDirectionConstants.XAxial形式で入力・取得します。")> _
    Public Property XAxialDirection() As AxialDirectionConstants.XAxial

        Get
            Return Me.XAD
        End Get

        Set(ByVal value As AxialDirectionConstants.XAxial)
            Me.XAD = value
        End Set

    End Property

    ''' <summary>Y軸の方向(Yのプラス方向)</summary>
    <Category("仮想座標"), DefaultValue(AxialDirectionConstants.YAxial.Bottom), Description("仮想座標のY軸の方向(プラス側)をAxialDirectionConstants.YAxial形式で入力・取得します。")> _
    Public Property YAxialDirection() As AxialDirectionConstants.YAxial

        Get
            Return Me.YAD
        End Get

        Set(ByVal value As AxialDirectionConstants.YAxial)
            Me.YAD = value
        End Set

    End Property

    ''' <summary>仮想座標のモード</summary>
    <Category("仮想座標"), DefaultValue(ScaleModeConstants.vbPixels), RefreshProperties(RefreshProperties.Repaint), Description("仮想座標のモードをScaleModeConstants形式で入力・取得します。")> _
    Public Property ScaleMode() As ScaleModeConstants

        Get
            Return Me.SM
        End Get

        Set(ByVal value As ScaleModeConstants)
            Me.SM = value
            Init_CurrentValue()
        End Set

    End Property
#End Region

#Region "描写系"
    ''' <summary>描写位置X</summary>
    <Category("VB描写"), DefaultValue(0.0F), RefreshProperties(RefreshProperties.Repaint), Description("次の描写で書き始める座標位置Xを入力・取得します。")> _
    Public Property CurrentX() As Single
        Get
            Return Me.NowX
        End Get
        Set(ByVal value As Single)
            Me.NowX = value
        End Set
    End Property

    ''' <summary>描写位置Y</summary>
    <Category("VB描写"), DefaultValue(0.0F), RefreshProperties(RefreshProperties.Repaint), Description("次の描写で書き始める座標位置Yを入力・取得します。")> _
    Public Property CurrentY() As Single
        Get
            Return Me.NowY
        End Get
        Set(ByVal value As Single)
            Me.NowY = value
        End Set
    End Property

    ''' <summary>直線や円を描く時の線の色(ColorConstants形式(ARGB形式))</summary>
    <Category("VB描写"), DefaultValue(ColorConstants.vbBlack), Description("直線や円を描く時の線の色をColorConstants形式(ARGB形式)で入力・取得します。")> _
    Public Property DrawColor() As ColorConstants

        Get
            Return DirectCast(Me.DrawPen.Color.ToArgb(), ColorConstants)
        End Get

        Set(ByVal value As ColorConstants)
            Me.DrawPen.Color = Color.FromArgb(value)
        End Set

    End Property

    ''' <summary>直線や円を描く時の線の太さ(0.0以下は代入不可)</summary>
    <Category("VB描写"), DefaultValue(1.0F), Description("直線や円を描く時の線の太さ(0.0以下は代入不可)を入力・取得します。")> _
    Public Property DrawWidth() As Single

        Get
            Return Me.DrawPen.Width
        End Get

        Set(ByVal value As Single)
            If value <= 0.0F Then
                Exit Property
            End If

            Me.DrawPen.Width = value
        End Set

    End Property

    ''' <summary>直線や円を描く時の線の上書き手法</summary>
    <Category("VB描写"), DefaultValue(System.Drawing.Drawing2D.CompositingMode.SourceOver), Description("直線や円を描く時の上書き手法をSystem.Drawing.Drawing2D.CompositingMode形式で入力・取得します。")> _
    Public Property DrawCompositingMode() As System.Drawing.Drawing2D.CompositingMode

        Get
            Return Me.DrawCMode
        End Get

        Set(ByVal value As System.Drawing.Drawing2D.CompositingMode)
            Me.DrawCMode = value

            If Not Me.TargetGraphics Is Nothing Then
                Me.TargetGraphics.CompositingMode = value
            End If
        End Set

    End Property

    ''' <summary>直線や円を描く時の線の品質</summary>
    <Category("VB描写"), DefaultValue(System.Drawing.Drawing2D.SmoothingMode.Default), Description("直線や円を描く時の品質をSystem.Drawing.Drawing2D.SmoothingMode形式で入力・取得します。")> _
    Public Property DrawSmoothingMode() As System.Drawing.Drawing2D.SmoothingMode

        Get
            Return Me.DrawSMode
        End Get

        Set(ByVal value As System.Drawing.Drawing2D.SmoothingMode)
            Me.DrawSMode = value

            If Not Me.TargetGraphics Is Nothing Then
                Me.TargetGraphics.SmoothingMode = value
            End If
        End Set

    End Property

    ''' <summary>直線や円弧・扇を描く時の破線時の形</summary> 
    <Category("VB描写"), DefaultValue(System.Drawing.Drawing2D.DashCap.Flat), Description("直線や円弧・扇を描く時の線の破線時の形をSystem.Drawing.Drawing2D.DashCap形式で入力・取得します。")> _
    Public Property DrawDashCap() As System.Drawing.Drawing2D.DashCap

        Get
            Return Me.DrawPen.DashCap
        End Get

        Set(ByVal value As System.Drawing.Drawing2D.DashCap)
            Me.DrawPen.DashCap = value
        End Set

    End Property

    ''' <summary>直線や円弧・扇を描く時の線の始点の形</summary> 
    <Category("VB描写"), DefaultValue(System.Drawing.Drawing2D.LineCap.Flat), Description("直線や円弧・扇を描く時の線の始点の形をSystem.Drawing.Drawing2D.LineCap形式で入力・取得します。")> _
    Public Property DrawStartCap() As System.Drawing.Drawing2D.LineCap

        Get
            Return Me.DrawPen.StartCap
        End Get

        Set(ByVal value As System.Drawing.Drawing2D.LineCap)
            Me.DrawPen.StartCap = value
        End Set

    End Property

    ''' <summary>直線や円弧・扇を描く時の線の終点の形</summary> 
    <Category("VB描写"), DefaultValue(System.Drawing.Drawing2D.LineCap.Flat), Description("直線や円弧・扇を描く時の線の終点の形をSystem.Drawing.Drawing2D.LineCap形式で入力・取得します。")> _
    Public Property DrawEndCap() As System.Drawing.Drawing2D.LineCap

        Get
            Return Me.DrawPen.EndCap
        End Get

        Set(ByVal value As System.Drawing.Drawing2D.LineCap)
            Me.DrawPen.EndCap = value
        End Set

    End Property

    ''' <summary>直線や円を描く時の線のスタイル int型でしてしても良い(0～4)</summary>
    <Category("VB描写"), DefaultValue(DrawStyleConstants.vbSolid), Description("直線や円を描く時の線のスタイルをDrawStyleConstants形式またはint型(0～4)で入力・取得します。")> _
    Public Property DrawStyle() As DrawStyleConstants

        Get
            Dim value As DrawStyleConstants

            Select Case Me.DrawPen.DashStyle
                Case System.Drawing.Drawing2D.DashStyle.Solid
                    value = DrawStyleConstants.vbSolid
                    Exit Select

                Case System.Drawing.Drawing2D.DashStyle.Dash
                    value = DrawStyleConstants.vbDash
                    Exit Select

                Case System.Drawing.Drawing2D.DashStyle.Dot
                    value = DrawStyleConstants.vbDot
                    Exit Select

                Case System.Drawing.Drawing2D.DashStyle.DashDot
                    value = DrawStyleConstants.vbDashDot
                    Exit Select

                Case System.Drawing.Drawing2D.DashStyle.DashDotDot
                    value = DrawStyleConstants.vbDashDotDot
                    Exit Select

            End Select

            Return value
        End Get

        Set(ByVal value As DrawStyleConstants)

            Select Case value
                Case DrawStyleConstants.vbSolid
                    Me.DrawPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid
                    Exit Select

                Case DrawStyleConstants.vbDash
                    Me.DrawPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash
                    Exit Select

                Case DrawStyleConstants.vbDot
                    Me.DrawPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot
                    Exit Select

                Case DrawStyleConstants.vbDashDot
                    Me.DrawPen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot
                    Exit Select

                Case DrawStyleConstants.vbDashDotDot
                    Me.DrawPen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDotDot
                    Exit Select

                Case Else
                    Exit Select
            End Select
        End Set

    End Property

    ''' <summary>直線や円を描く時の塗りつぶしの色(ColorConstants形式(ARGB形式))</summary>
    <Category("VB描写"), DefaultValue(ColorConstants.vbBlack), Description("直線(長方形モード時)や円(扇形モード時)を描く時の塗りつぶしの色をColorConstants形式(ARGB形式)で入力・取得します。")> _
    Public Property FillColor() As ColorConstants

        Get
            Return DirectCast(Me.FillBrush.ForegroundColor.ToArgb(), ColorConstants)
        End Get

        Set(ByVal value As ColorConstants)
            Dim tmp As System.Drawing.Drawing2D.HatchBrush = DirectCast(Me.FillBrush.Clone(), System.Drawing.Drawing2D.HatchBrush)
            Me.FillBrush.Dispose()
            Me.FillBrush = New System.Drawing.Drawing2D.HatchBrush(tmp.HatchStyle, System.Drawing.Color.FromArgb(value), tmp.BackgroundColor)
            tmp.Dispose()
        End Set

    End Property

    ''' <summary>直線や円を描く時の塗りつぶしのスタイル int型でしてしても良い(0～7)</summary>
    <Category("VB描写"), DefaultValue(FillStyleConstants.vbFSTransparent), Description("直線や円を描く時の塗りつぶしのスタイルをFillStyleConstants形式またはint型(0～7)で入力・取得します。")> _
    Public Property FillStyle() As FillStyleConstants

        Get
            Return Me.FStyle
        End Get

        Set(ByVal value As FillStyleConstants)
            Dim tmp As System.Drawing.Drawing2D.HatchStyle = Drawing2D.HatchStyle.ZigZag

            Select Case value
                Case FillStyleConstants.vbFSSolid
                    Exit Select

                Case FillStyleConstants.vbFSTransparent
                    Exit Select

                Case FillStyleConstants.vbHorizontalLine
                    tmp = Drawing2D.HatchStyle.Horizontal
                    Exit Select

                Case FillStyleConstants.vbVerticalLine
                    tmp = Drawing2D.HatchStyle.Vertical
                    Exit Select

                Case FillStyleConstants.vbUpwardDiagonal
                    tmp = Drawing2D.HatchStyle.ForwardDiagonal
                    Exit Select

                Case FillStyleConstants.vbDownwardDiagonal
                    tmp = Drawing2D.HatchStyle.BackwardDiagonal
                    Exit Select

                Case FillStyleConstants.vbCross
                    tmp = Drawing2D.HatchStyle.Cross
                    Exit Select

                Case FillStyleConstants.vbDiagonalCross
                    tmp = Drawing2D.HatchStyle.DiagonalCross
                    Exit Select

                Case Else
                    Exit Property
                    Exit Select
            End Select

            If tmp <> Drawing2D.HatchStyle.ZigZag Then
                Dim htmp As System.Drawing.Drawing2D.HatchBrush = DirectCast(Me.FillBrush.Clone(), System.Drawing.Drawing2D.HatchBrush)
                Me.FillBrush.Dispose()
                Me.FillBrush = New System.Drawing.Drawing2D.HatchBrush(tmp, htmp.ForegroundColor, htmp.BackgroundColor)
                htmp.Dispose()
            End If

            Me.FStyle = value
        End Set

    End Property

    ''' <summary>文字を書くときのフォント</summary>
    <Category("VB描写"), RefreshProperties(RefreshProperties.None), Description("文字を書くときのフォントを入力・取得します。")> _
    Public Property DrawFont() As System.Drawing.Font
        Get
            Return MyBase.Font
        End Get

        Set(ByVal value As System.Drawing.Font)
            MyBase.Font = value
        End Set
    End Property
#End Region

#Region "その他"
    ''' <summary>自動的に再描写するかどうか</summary>
    <Category("Behavior"), DefaultValue(False), Description("自動的に再描写するかどうかを入力・取得します。")> _
    Public Property AutoRedraw() As Boolean

        Get
            Return Me.ARedraw
        End Get

        Set(ByVal value As Boolean)
            Me.ARedraw = value
        End Set

    End Property

    ''' <summary>自動的にイメージをリサイズするかどうか(注：StartingInitの時点での大きさを基にしているので画像が崩れることがある)</summary> 
    <Category("Behavior"), DefaultValue(False), Description("自動的にイメージをリサイズするかどうかを入力・取得します。(TrueにするとSizeModeがStretchImageになります。)")> _
    Public Property AutoResize() As Boolean

        Get
            Return If(MyBase.SizeMode = Windows.Forms.PictureBoxSizeMode.Normal, False, True)
        End Get

        Set(ByVal value As Boolean)
            MyBase.SizeMode = If(value = True, Windows.Forms.PictureBoxSizeMode.StretchImage, Windows.Forms.PictureBoxSizeMode.Normal)
        End Set

    End Property

    ''' <summary>現在の描画画像を取得(コピー)、もし生成されていなかったらNothing(null)を返す 代入は前のイメージが破棄される</summary>
    <Browsable(False)> _
    Public Overloads Property Image() As System.Drawing.Image
        Get
            Return DirectCast(If(Me.ScaleImage Is Nothing, Nothing, Me.ScaleImage.Clone()), System.Drawing.Image)
        End Get

        Set(ByVal value As System.Drawing.Image)
            If Not Me.TargetGraphics Is Nothing Then
                Me.TargetGraphics.Dispose()
            End If

            If Not Me.ScaleImage Is Nothing Then
                Me.ScaleImage.Dispose()
            End If

            Me.ScaleImage = DirectCast(value, System.Drawing.Bitmap)
            MyBase.Image = Me.ScaleImage

            If Not Me.ScaleImage Is Nothing AndAlso Not Me.TargetGraphics Is Nothing Then
                Me.TargetGraphics = GetTargetGraphics()
            End If

            TryAutoRedraw()
        End Set
    End Property

    ''' <summary>既にStarting_Initが行われており、すぐ使える状態かどうか(Interruptでの中断では変化しない)</summary>
    <Browsable(False)> _
    Public Property StartEnabled() As Boolean
        Get
            Return Me.StartEnabledFlag
        End Get

        Private Set(ByVal value As Boolean)
            Me.StartEnabledFlag = value
        End Set
    End Property
#End Region

#End Region

#Region "初期化・設定メソッド"
    ''' <summary>コンストラクタ(基底クラスのPictureBoxも生成)</summary> 
    Public Sub New()
        MyBase.New()

        Me.StartEnabledFlag = False
        Me.TargetGraphics = Nothing
        Me.ScaleImage = Nothing

        Me.DrawPen = New Pen(Color.Black, 1.0F)
        Me.DrawPen.DashCap = Drawing2D.DashCap.Flat
        Me.DrawPen.StartCap = System.Drawing.Drawing2D.LineCap.Flat
        Me.DrawPen.EndCap = Drawing2D.LineCap.Flat
        Me.FillBrush = New System.Drawing.Drawing2D.HatchBrush(Drawing2D.HatchStyle.Horizontal, Color.Black, MyBase.BackColor)
        Me.FStyle = FillStyleConstants.vbFSTransparent
        Me.DrawCMode = Drawing2D.CompositingMode.SourceOver
        Me.DrawSMode = Drawing2D.SmoothingMode.Default

        Me.SW = 100
        Me.SL = 0
        Me.SH = 100
        Me.ST = 0
        Me.SM = ScaleModeConstants.vbPixels
        Me.XAD = AxialDirectionConstants.XAxial.Right
        Me.YAD = AxialDirectionConstants.YAxial.Bottom

        Me.AutoRedraw = False
        Me.AutoResize = False

        Init_CurrentValue()
    End Sub

    ''' <summary>リソースの開放</summary> 
    Protected Overloads Sub Dispose(ByVal disposing As Boolean)
        If Not Me.TargetGraphics Is Nothing Then
            Me.TargetGraphics.Dispose()
        End If

        If Not Me.ScaleImage Is Nothing Then
            Me.ScaleImage.Dispose()
        End If

        Me.DrawPen.Dispose()
        Me.FillBrush.Dispose()
        MyBase.Dispose(disposing)
    End Sub

    ''' <summary>Scale～の設定(vbUserに自動設定、Current～も初期化)</summary> 
    ''' <param name="ScaleWidth">仮想座標の幅(マイナスの値の場合はX軸の方向がLeftになる)</param> 
    ''' <param name="ScaleHeight">仮想座標の高さ(マイナスの値の場合はY軸の方向がTopになる)</param> 
    ''' <param name="ScaleLeft">仮想座標の左端の値</param> 
    ''' <param name="ScaleTop">仮想座標の上端の値</param> 
    Public Sub Init_Scale(ByVal ScaleLeft As Single, ByVal ScaleTop As Single, ByVal ScaleWidth As Single, ByVal ScaleHeight As Single)
        Me.ScaleWidth = ScaleWidth
        Me.ScaleLeft = ScaleLeft
        Me.ScaleHeight = ScaleHeight
        Me.ScaleTop = ScaleTop
        Me.ScaleMode = ScaleModeConstants.vbUser

        Init_CurrentValue()
    End Sub

    ''' <summary>実際に使うための準備メソッド 描いてあるイメージなどは全て破棄する</summary>
    Public Sub Starting_Init()
        If MyBase.Width = 0 OrElse MyBase.Height = 0 Then
            System.Windows.Forms.MessageBox.Show("Starting_Init : PictureBoxの幅及び高さが0の時にはこのメソッドは使えません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        If Not Me.TargetGraphics Is Nothing Then
            Me.TargetGraphics.Dispose()
        End If

        If Not Me.ScaleImage Is Nothing Then
            Me.ScaleImage.Dispose()
        End If

        Me.ScaleImage = New Bitmap(MyBase.Width, MyBase.Height)
        MyBase.Image = Me.ScaleImage

        Me.TargetGraphics = GetTargetGraphics()
        Me.StartEnabled = True
        Me.Converter = New PictureBoxUnitConvert(Me)
    End Sub

    ''' <summary>内部の動作を一時停止・再稼働させる(ResizeはそのままRedrawは停止、Graphicsオブジェクトを破棄・再生成)</summary>
    Public Sub Interrupt()
        If Not Me.StartEnabled Then
            System.Windows.Forms.MessageBox.Show("Interrupt : Starting_Initしてない状態ではこのメソッドは使えません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        If Me.TargetGraphics Is Nothing Then
            Me.TargetGraphics = GetTargetGraphics()
            TryAutoRedraw()
        Else
            Me.TargetGraphics.Dispose()
            Me.TargetGraphics = Nothing
        End If
    End Sub

    ''' <summary>外部アクセスの場合に使うメソッド Graphicsオブジェクトを作成して返す</summary>
    ''' <param name="DirectAccess">直接アクセスするかどうか 直接アクセスでImageに直接描写する 省略可 その場合Falseになる</param>
    ''' <returns>作られたGraphicsオブジェクト</returns>
    ''' <remarks>
    ''' <example>メソッドの使用例 
    ''' <para>注意：これを直接アクセスで使う場合Interruptで一時停止させる必要がある。通常アクセスは基底クラスのCreateGraphicsと同じである。</para>
    ''' <para>外部アクセス時にはAutoRedrawは動作しないので内部動作を再開した時のRedrawに任せるか、明示的にPictureBox.Redraw()を呼び出す。</para>
    ''' <para>PictureBox.Interrupt()</para>
    ''' <para>Dim g As Graphics = PictureBox.CreateGraphics(True)</para>
    ''' <para>g.DrawRectangle(Pens.Black,PictureBox.X(-0.5), _</para>
    ''' <para>PictureBox.Y(0.5),PictureBox.VX(1),PictureBox.VY(1))</para>
    ''' <para>g.Dispose()</para>
    ''' <para>PictureBox.Interrupt()：(この時点でAutoRedrawが再開される。)</para>
    ''' </example></remarks>
    Public Overloads Function CreateGraphics(Optional ByVal DirectAccess As Boolean = False) As System.Drawing.Graphics
        If DirectAccess Then
            If Not Me.TargetGraphics Is Nothing Then
                System.Windows.Forms.MessageBox.Show("CreateGraphics : Interruptで中断していない状態ではこのメソッドは使えません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
                Return Nothing
            End If

            Return Graphics.FromImage(Me.ScaleImage)
        Else
            Return MyBase.CreateGraphics()
        End If
    End Function

    ''' <summary>単位変換メソッドを提供します。</summary>
    Public Function Cnv() As PictureBoxUnitConvert
        If Not Me.StartEnabled Then
            System.Windows.Forms.MessageBox.Show("Cnv : Starting_Initしてない状態ではこのメソッドにアクセスできません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Return Nothing
        End If

        Return Me.Converter
    End Function

    ''' <summary>Current～の値の初期化メソッド</summary>
    Private Sub Init_CurrentValue()
        If Me.ScaleWidth < 0 Then
            Me.SW = -Me.SW
            Me.XAxialDirection = AxialDirectionConstants.XAxial.Left
        End If

        If Me.ScaleHeight < 0 Then
            Me.SH = -Me.SH
            Me.YAxialDirection = AxialDirectionConstants.YAxial.Top
        End If

        If Me.ScaleMode = ScaleModeConstants.vbUser Then
            Me.CurrentX = Me.ScaleLeft
            Me.CurrentY = Me.ScaleTop
        Else
            Me.CurrentX = If(Me.XAxialDirection = AxialDirectionConstants.XAxial.Right, 0, If(Me.ScaleImage Is Nothing, MyBase.Width, Me.ScaleImage.Width))
            Me.CurrentY = If(Me.YAxialDirection = AxialDirectionConstants.YAxial.Bottom, 0, If(Me.ScaleImage Is Nothing, MyBase.Height, Me.ScaleImage.Height))
        End If
    End Sub

    ''' <summary>イメージに対して描画するGraphicsオブジェクトを取得する</summary>
    ''' <returns>Graphicsオブジェクト</returns>
    Private Function GetTargetGraphics() As Graphics
        Dim g As Graphics = Graphics.FromImage(Me.ScaleImage)
        g.CompositingMode = Me.DrawCompositingMode
        g.SmoothingMode = Me.DrawSmoothingMode
        Return g
    End Function
#End Region

#Region "Redrawメソッド"
    ''' <summary>AutoRedrawに従って非同期で再描画する</summary> 
    Private Sub TryAutoRedraw()
        If Not Me.AutoRedraw Then
            Exit Sub
        End If

        MyBase.Invalidate()
    End Sub

    ''' <summary>再描写する(基底クラスのCreateGraphicsからアクセスして再描画する場合は非同期で行うと動作がおかしくなる)</summary> 
    ''' <param name="NonSynchronize">非同期で再描画するかどうか 省略化 その場合Trueになる</param>
    Public Sub Redraw(Optional ByVal NonSynchronize As Boolean = True)
        If NonSynchronize Then
            MyBase.Invalidate()
        Else
            MyBase.Refresh()
        End If
    End Sub
#End Region

#Region "単位変換メソッド"

#Region "通常変換"
    ''' <summary>GetX() : ScaleModeに従ってある単位での座標Xをピクセル単位での座標Xに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での座標値</param> 
    ''' <returns>ピクセル単位の座標値</returns> 
    ''' <remarks>内部アクセス名<para>GetX()</para></remarks>
    Public Function X(ByVal Value As Single) As Single
        Return GetX(Value)
    End Function

    ''' <summary>GetY() : ScaleModeに従ってある単位での座標Yをピクセル単位での座標Yに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での座標値</param> 
    ''' <returns>ピクセル単位の座標値</returns> 
    ''' <remarks>内部アクセス名<para>GetY()</para></remarks>
    Public Function Y(ByVal Value As Single) As Single
        Return GetY(Value)
    End Function

    ''' <summary>GetArrayX() : ScaleModeに従ってある単位での座標配列Xをピクセル単位での座標配列Xに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での座標値配列</param> 
    ''' <returns>ピクセル単位の座標値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetArrayX()</para></remarks>
    Public Function AX(ByVal Value() As Single) As Single()
        Return GetArrayX(Value)
    End Function

    ''' <summary>GetArrayY() : ScaleModeに従ってある単位での座標配列Yをピクセル単位での座標配列Yに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での座標値配列</param> 
    ''' <returns>ピクセル単位の座標値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetArrayY()</para></remarks>
    Public Function AY(ByVal Value() As Single) As Single()
        Return GetArrayY(Value)
    End Function

    ''' <summary>GetValueX() : ScaleModeに従ってある単位の値Xをピクセル単位の値Xに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での値</param> 
    ''' <returns>ピクセル単位の値</returns> 
    ''' <remarks>内部アクセス名<para>GetValueX()</para></remarks>
    Public Function VX(ByVal Value As Single) As Single
        Return GetValueX(Value)
    End Function

    ''' <summary>GetValueY() : ScaleModeに従ってある単位の値Yをピクセル単位の値Yに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での値</param> 
    ''' <returns>ピクセル単位の値</returns> 
    ''' <remarks>内部アクセス名<para>GetValueY()</para></remarks>
    Public Function VY(ByVal Value As Single) As Single
        Return GetValueY(Value)
    End Function

    ''' <summary>GetValueArrayX() : ScaleModeに従ってある単位の値配列Xをピクセル単位の値配列Xに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での値配列</param> 
    ''' <returns>ピクセル単位の値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetValueArrayX()</para></remarks>
    Public Function VAX(ByVal Value() As Single) As Single()
        Return GetValueArrayX(Value)
    End Function

    ''' <summary>GetValueArrayY() : ScaleModeに従ってある単位の値配列Yをピクセル単位の値配列Yに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での値配列</param> 
    ''' <returns>ピクセル単位の値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetValueArrayY()</para></remarks>
    Public Function VAY(ByVal Value() As Single) As Single()
        Return GetValueArrayY(Value)
    End Function

    ''' <summary>GetPoint() : ScaleModeに従ってある単位の座標点をピクセル単位の座標点に変換して返す</summary>
    ''' <param name="Value">変換前の単位での座標点</param>
    ''' <returns>ピクセル単位の座標点</returns>
    ''' <remarks>内部アクセス名<para>GetPoint()</para></remarks>
    Public Function P(ByVal Value As PointF) As PointF
        Return GetPoint(Value)
    End Function

    ''' <summary>GetArrayPoint() : ScaleModeに従ってある単位の座標点配列をピクセル単位の座標点配列に変換して返す</summary>
    ''' <param name="Value">変換前の単位での座標点配列</param>
    ''' <returns>ピクセル単位の座標点配列</returns>
    ''' <remarks>内部アクセス名<para>GetArrayPoint()</para></remarks>
    Public Function AP(ByVal Value() As PointF) As PointF()
        Return GetArrayPoint(Value)
    End Function

    ''' <summary>GetValueSize() : ScaleModeに従ってある単位のサイズをピクセル単位のサイズに変換して返す</summary> 
    ''' <param name="Value">変換前の単位でのサイズ</param> 
    ''' <returns>ピクセル単位のサイズ</returns> 
    ''' <remarks>内部アクセス名<para>GetValueSize()</para></remarks>
    Public Function VS(ByVal Value As SizeF) As SizeF
        Return GetValueSize(Value)
    End Function

    ''' <summary>GetValueArraySize() : ScaleModeに従ってある単位のサイズ配列をピクセル単位のサイズ配列に変換して返す</summary> 
    ''' <param name="Value">変換前の単位でのサイズ配列</param> 
    ''' <returns>ピクセル単位のサイズ配列</returns> 
    ''' <remarks>内部アクセス名<para>GetValueArraySize()</para></remarks>
    Public Function VAS(ByVal Value() As SizeF) As SizeF()
        Return GetValueArraySize(Value)
    End Function
#End Region

#Region "逆変換"
    ''' <summary>GetReverseX() : ピクセル単位での座標XをScaleModeに従ってある単位での座標Xに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の座標値</param> 
    ''' <returns>変換後の単位での座標値</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseX()</para></remarks>
    Public Function RX(ByVal Value As Single) As Single
        Return GetReverseX(Value)
    End Function

    ''' <summary>GetReverseY() : ピクセル単位での座標YをScaleModeに従ってある単位での座標Yに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の座標値</param> 
    ''' <returns>変換後の単位での座標値</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseY()</para></remarks>
    Public Function RY(ByVal Value As Single) As Single
        Return GetReverseY(Value)
    End Function

    ''' <summary>GetReverseArrayX() : ピクセル単位での座標配列XをScaleModeに従ってある単位での座標配列Xに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の座標値配列</param> 
    ''' <returns>変換後の単位での座標値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseArrayX()</para></remarks>
    Public Function RAX(ByVal Value() As Single) As Single()
        Return GetReverseArrayX(Value)
    End Function

    ''' <summary>GetReverseArrayY() : ピクセル単位での座標配列YをScaleModeに従ってある単位での座標配列Yに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の座標値配列</param> 
    ''' <returns>変換後の単位での座標値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseArrayY()</para></remarks>
    Public Function RAY(ByVal Value() As Single) As Single()
        Return GetReverseArrayY(Value)
    End Function

    ''' <summary>GetReverseValueX() : ピクセル単位の値XをScaleModeに従ってある単位の値Xに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の値</param> 
    ''' <returns>変換後の単位での値</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseValueX()</para></remarks>
    Public Function RVX(ByVal Value As Single) As Single
        Return GetReverseValueX(Value)
    End Function

    ''' <summary>GetReverseValueY() : ピクセル単位の値YをScaleModeに従ってある単位の値Yに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の値</param> 
    ''' <returns>変換後の単位での値</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseValueY()</para></remarks>
    Public Function RVY(ByVal Value As Single) As Single
        Return GetReverseValueY(Value)
    End Function

    ''' <summary>GetReverseValueArrayX() : ピクセル単位の値配列XをScaleModeに従ってある単位の値配列Xに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の値配列</param> 
    ''' <returns>変換後の単位での値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseValueArrayX()</para></remarks>
    Public Function RVAX(ByVal Value() As Single) As Single()
        Return GetReverseValueArrayX(Value)
    End Function

    ''' <summary>GetReverseValueArrayY() : ピクセル単位の値配列YをScaleModeに従ってある単位の値配列Yに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の値配列</param> 
    ''' <returns>変換後の単位での値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseValueArrayY()</para></remarks>
    Public Function RVAY(ByVal Value() As Single) As Single()
        Return GetReverseValueArrayY(Value)
    End Function

    ''' <summary>GetReversePoint() : ピクセル単位での座標点をScaleModeに従ってある単位での座標点に変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の座標点</param> 
    ''' <returns>変換後の単位での座標点</returns> 
    ''' <remarks>内部アクセス名<para>GetReversePoint()</para></remarks>
    Public Function RP(ByVal Value As PointF) As PointF
        Return GetReversePoint(Value)
    End Function

    ''' <summary>GetReverseArrayPoint() : ピクセル単位での座標点配列をScaleModeに従ってある単位での座標点配列に変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の座標点配列</param> 
    ''' <returns>変換後の単位での座標点配列</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseArrayPoint()</para></remarks>
    Public Function RAP(ByVal Value() As PointF) As PointF()
        Return GetReverseArrayPoint(Value)
    End Function

    ''' <summary>GetReverseValueSize() : ピクセル単位でのサイズをScaleModeに従ってある単位でのサイズに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位のサイズ</param> 
    ''' <returns>変換後の単位でのサイズ</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseValueSize()</para></remarks>
    Public Function RVS(ByVal Value As SizeF) As SizeF
        Return GetReverseValueSize(Value)
    End Function

    ''' <summary>GetReverseValueArraySize() : ピクセル単位でのサイズ配列をScaleModeに従ってある単位でのサイズ配列に変換して返す</summary> 
    ''' <param name="Value">ピクセル単位のサイズ配列</param> 
    ''' <returns>変換後の単位でのサイズ配列</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseValueArraySize()</para></remarks>
    Public Function RVAS(ByVal Value() As SizeF) As SizeF()
        Return GetReverseValueArraySize(Value)
    End Function
#End Region

#Region "その他の変換"
    ''' <summary>GetStepX() : 前の描画位置からの相対座標値Xを本来の座標値Xに変換して返す</summary>
    ''' <param name="Value">前の描画位置からの相対座標値</param>
    ''' <returns>本来の座標値</returns>
    ''' <remarks>内部アクセス名<para>GetStepX()</para></remarks>
    Public Function SX(ByVal Value As Single) As Single
        Return GetStepX(Value)
    End Function

    ''' <summary>GetStepY() : 前の描画位置からの相対座標値Yを本来の座標値Yに変換して返す</summary>
    ''' <param name="Value">前の描画位置からの相対座標値</param>
    ''' <returns>本来の座標値</returns>
    ''' <remarks>内部アクセス名<para>GetStepY()</para></remarks>
    Public Function SY(ByVal Value As Single) As Single
        Return GetStepY(Value)
    End Function

    ''' <summary>GetStepArrayX() : 前の描画位置からの相対座標値配列Xを本来の座標値配列Xに変換して返す</summary>
    ''' <param name="Value">前の描画位置からの相対座標値配列</param>
    ''' <returns>本来の座標値配列</returns>
    ''' <remarks>内部アクセス名<para>GetStepArrayX()</para></remarks>
    Public Function SAX(ByVal Value() As Single) As Single()
        Return GetStepArrayX(Value)
    End Function

    ''' <summary>GetStepArrayY() : 前の描画位置からの相対座標値配列Yを本来の座標値配列Yに変換して返す</summary>
    ''' <param name="Value">前の描画位置からの相対座標値配列</param>
    ''' <returns>本来の座標値配列</returns>
    ''' <remarks>内部アクセス名<para>GetStepArrayY()</para></remarks>
    Public Function SAY(ByVal Value() As Single) As Single()
        Return GetStepArrayY(Value)
    End Function

    ''' <summary>GetStepPoint() : 前の描画位置からの相対座標点を本来の座標点に変換して返す</summary>
    ''' <param name="Value">前の描画位置からの相対座標点</param>
    ''' <returns>本来の座標点</returns>
    ''' <remarks>内部アクセス名<para>GetStepPoint()</para></remarks>
    Public Function SP(ByVal Value As PointF) As PointF
        Return GetStepPoint(Value)
    End Function

    ''' <summary>GetStepArrayPoint() : 前の描画位置からの相対座標点配列を本来の座標点配列に変換して返す</summary>
    ''' <param name="Value">前の描画位置からの相対座標点配列</param>
    ''' <returns>本来の座標点配列</returns>
    ''' <remarks>内部アクセス名<para>GetStepArrayPoint()</para></remarks>
    Public Function SAP(ByVal Value() As PointF) As PointF()
        Return GetStepArrayPoint(Value)
    End Function

    ''' <summary>GetPartialArray() : ある座標値配列から指定した範囲だけを抜き出して返す</summary>
    ''' <param name="Value">基となる座標値配列</param>
    ''' <param name="Length">配列の先頭からの抜き出したい要素数</param>
    ''' <returns>抜き出した後の座標値配列</returns>
    ''' <remarks>内部アクセス名<para>GetPartialArray()</para></remarks>
    Public Function PA(ByVal Value() As Single, ByVal Length As Integer) As Single()
        Return GetPartialArray(Value, 0, Length - 1)
    End Function

    ''' <summary>GetPartialArray() : ある座標点配列から指定した範囲だけを抜き出して返す</summary>
    ''' <param name="Value">基となる座標点配列</param>
    ''' <param name="Length">配列の先頭からの抜き出したい要素数</param>
    ''' <returns>抜き出した後の座標点配列</returns>
    ''' <remarks>内部アクセス名<para>GetPartialArray()</para></remarks>
    Public Function PA(ByVal Value() As PointF, ByVal Length As Integer) As PointF()
        Return GetPartialArray(Value, 0, Length - 1)
    End Function

    ''' <summary>GetPartialArray() : あるサイズ配列から指定した範囲だけを抜き出して返す</summary>
    ''' <param name="Value">基となるサイズ配列</param>
    ''' <param name="Length">配列の先頭からの抜き出したい要素数</param>
    ''' <returns>抜き出した後のサイズ配列</returns>
    ''' <remarks>内部アクセス名<para>GetPartialArray()</para></remarks>
    Public Function PA(ByVal Value() As SizeF, ByVal Length As Integer) As SizeF()
        Return GetPartialArray(Value, 0, Length - 1)
    End Function

    ''' <summary>GetPartialArray() : ある座標値配列から指定した範囲だけを抜き出して返す</summary>
    ''' <param name="Value">基となる座標値配列</param>
    ''' <param name="StartIndex">配列の先頭からの抜き出したい最初の要素番号</param>
    ''' <param name="EndIndex">配列の先頭からの抜き出したい最後の要素番号</param>
    ''' <returns>抜き出した後の座標値配列</returns>
    ''' <remarks>内部アクセス名<para>GetPartialArray()</para></remarks>
    Public Function PA(ByVal Value() As Single, ByVal StartIndex As Integer, ByVal EndIndex As Integer) As Single()
        Return GetPartialArray(Value, StartIndex, EndIndex)
    End Function

    ''' <summary>GetPartialArray() : ある座標点配列から指定した範囲だけを抜き出して返す</summary>
    ''' <param name="Value">基となる座標点配列</param>
    ''' <param name="StartIndex">配列の先頭からの抜き出したい最初の要素番号</param>
    ''' <param name="EndIndex">配列の先頭からの抜き出したい最後の要素番号</param>
    ''' <returns>抜き出した後の座標点配列</returns>
    ''' <remarks>内部アクセス名<para>GetPartialArray()</para></remarks>
    Public Function PA(ByVal Value() As PointF, ByVal StartIndex As Integer, ByVal EndIndex As Integer) As PointF()
        Return GetPartialArray(Value, StartIndex, EndIndex)
    End Function

    ''' <summary>GetPartialArray() : あるサイズ配列から指定した範囲だけを抜き出して返す</summary>
    ''' <param name="Value">基となるサイズ配列</param>
    ''' <param name="StartIndex">配列の先頭からの抜き出したい最初の要素番号</param>
    ''' <param name="EndIndex">配列の先頭からの抜き出したい最後の要素番号</param>
    ''' <returns>抜き出した後のサイズ配列</returns>
    ''' <remarks>内部アクセス名<para>GetPartialArray()</para></remarks>
    Public Function PA(ByVal Value() As SizeF, ByVal StartIndex As Integer, ByVal EndIndex As Integer) As SizeF()
        Return GetPartialArray(Value, StartIndex, EndIndex)
    End Function
#End Region

#Region "メソッドの中身の記述"

#Region "内部通常変換"
    Friend Function GetX(ByVal X As Single) As Single

        Select Case Me.ScaleMode

            Case ScaleModeConstants.vbUser
                X = X - If(Me.XAxialDirection = AxialDirectionConstants.XAxial.Right, Me.ScaleLeft, Me.ScaleLeft - Me.ScaleWidth)
                X = X * (Me.ScaleImage.Width / Me.ScaleWidth)
                Exit Select

            Case ScaleModeConstants.vbTwips
            Case ScaleModeConstants.vbPoints
            Case ScaleModeConstants.vbPixels
            Case ScaleModeConstants.vbCharacters
            Case ScaleModeConstants.vbInches
            Case ScaleModeConstants.vbMillimeters
            Case ScaleModeConstants.vbCentimeters
            Case ScaleModeConstants.VbHimetric
                X = GetValueX(X)
                Exit Select
        End Select

        If Me.XAxialDirection = AxialDirectionConstants.XAxial.Left Then
            X = Me.ScaleImage.Width - X
        End If

        Return X
    End Function

    Friend Function GetValueX(ByVal VX As Single) As Single
        Dim dpi As Single = Graphics.FromHwnd(Me.Handle).DpiX

        Select Case Me.ScaleMode

            Case ScaleModeConstants.vbUser
                VX = VX * (Me.ScaleImage.Width / Me.ScaleWidth)
                Exit Select

            Case ScaleModeConstants.vbTwips
                VX = (VX / 1440.0F) * dpi
                Exit Select

            Case ScaleModeConstants.vbPoints
                VX = (VX / 72.0F) * dpi
                Exit Select

            Case ScaleModeConstants.vbPixels
                Exit Select

            Case ScaleModeConstants.vbCharacters
                VX = ((VX * 120.0F) / 1440.0F) * dpi
                Exit Select

            Case ScaleModeConstants.vbInches
                VX = VX * dpi
                Exit Select

            Case ScaleModeConstants.vbMillimeters
                VX = (VX / 25.4F) * dpi
                Exit Select

            Case ScaleModeConstants.vbCentimeters
                VX = (VX / 2.54F) * dpi
                Exit Select

            Case ScaleModeConstants.VbHimetric
                VX = (VX / 2540.0F) * dpi
                Exit Select
        End Select

        Return VX
    End Function

    Friend Function GetArrayX(ByVal X() As Single) As Single()
        Dim TX(0) As Single
        Array.Resize(TX, X.Length)

        For i = 0 To X.Length - 1
            TX(i) = GetX(X(i))
        Next

        Return TX
    End Function

    Friend Function GetValueArrayX(ByVal VX() As Single) As Single()
        Dim TX(0) As Single
        Array.Resize(TX, VX.Length)

        For i = 0 To VX.Length - 1
            TX(i) = GetValueX(VX(i))
        Next

        Return TX
    End Function

    Friend Function GetY(ByVal Y As Single) As Single

        Select Case Me.ScaleMode

            Case ScaleModeConstants.vbUser
                Y = Y - If(Me.YAxialDirection = AxialDirectionConstants.YAxial.Bottom, Me.ScaleTop, Me.ScaleTop - Me.ScaleHeight)
                Y = Y * (Me.ScaleImage.Height / Me.ScaleHeight)
                Exit Select

            Case ScaleModeConstants.vbTwips
            Case ScaleModeConstants.vbPoints
            Case ScaleModeConstants.vbPixels
            Case ScaleModeConstants.vbCharacters
            Case ScaleModeConstants.vbInches
            Case ScaleModeConstants.vbMillimeters
            Case ScaleModeConstants.vbCentimeters
            Case ScaleModeConstants.VbHimetric
                Y = GetValueY(Y)
                Exit Select
        End Select

        If Me.YAxialDirection = AxialDirectionConstants.YAxial.Top Then
            Y = Me.ScaleImage.Height - Y
        End If

        Return Y
    End Function

    Friend Function GetValueY(ByVal VY As Single) As Single
        Dim dpi As Single = Graphics.FromHwnd(Me.Handle).DpiX

        Select Case Me.ScaleMode

            Case ScaleModeConstants.vbUser
                VY = VY * (Me.ScaleImage.Height / Me.ScaleHeight)
                Exit Select

            Case ScaleModeConstants.vbTwips
                VY = (VY / 1440.0F) * dpi
                Exit Select

            Case ScaleModeConstants.vbPoints
                VY = (VY / 72.0F) * dpi
                Exit Select

            Case ScaleModeConstants.vbPixels
                Exit Select

            Case ScaleModeConstants.vbCharacters
                VY = ((VY * 120.0F) / 1440.0F) * dpi
                Exit Select

            Case ScaleModeConstants.vbInches
                VY = VY * dpi
                Exit Select

            Case ScaleModeConstants.vbMillimeters
                VY = (VY / 25.4F) * dpi
                Exit Select

            Case ScaleModeConstants.vbCentimeters
                VY = (VY / 2.54F) * dpi
                Exit Select

            Case ScaleModeConstants.VbHimetric
                VY = (VY / 2540.0F) * dpi
                Exit Select
        End Select

        Return VY
    End Function

    Friend Function GetArrayY(ByVal Y() As Single) As Single()
        Dim TY(0) As Single
        Array.Resize(TY, Y.Length)

        For i = 0 To Y.Length - 1
            TY(i) = GetY(Y(i))
        Next

        Return TY
    End Function

    Friend Function GetValueArrayY(ByVal VY() As Single) As Single()
        Dim TY(0) As Single
        Array.Resize(TY, VY.Length)

        For i = 0 To VY.Length - 1
            TY(i) = GetValueY(VY(i))
        Next

        Return TY
    End Function

    Friend Function GetPoint(ByVal P As PointF) As PointF
        P.X = GetX(P.X)
        P.Y = GetY(P.Y)

        Return P
    End Function

    Friend Function GetArrayPoint(ByVal P() As PointF) As PointF()
        Dim TP(0) As PointF
        Array.Resize(TP, P.Length)

        For i = 0 To P.Length - 1
            TP(i).X = GetX(P(i).X)
            TP(i).Y = GetY(P(i).Y)
        Next

        Return TP
    End Function

    Friend Function GetValueSize(ByVal S As SizeF) As SizeF
        S.Width = GetValueX(S.Width)
        S.Height = GetValueY(S.Height)

        Return S
    End Function

    Friend Function GetValueArraySize(ByVal S() As SizeF) As SizeF()
        Dim TS(0) As SizeF
        Array.Resize(TS, S.Length)

        For i = 0 To S.Length - 1
            TS(i).Width = GetValueX(S(i).Width)
            TS(i).Height = GetValueY(S(i).Height)
        Next

        Return TS
    End Function
#End Region

#Region "内部逆変換"
    Friend Function GetReverseX(ByVal X As Single) As Single
        If Me.XAxialDirection = AxialDirectionConstants.XAxial.Left Then
            X = Me.ScaleImage.Width - X
        End If

        Select Case Me.ScaleMode

            Case ScaleModeConstants.vbUser
                X = X * (Me.ScaleWidth / Me.ScaleImage.Width)
                X = X + If(Me.XAxialDirection = AxialDirectionConstants.XAxial.Right, Me.ScaleLeft, Me.ScaleLeft - Me.ScaleWidth)
                Exit Select

            Case ScaleModeConstants.vbTwips
            Case ScaleModeConstants.vbPoints
            Case ScaleModeConstants.vbPixels
            Case ScaleModeConstants.vbCharacters
            Case ScaleModeConstants.vbInches
            Case ScaleModeConstants.vbMillimeters
            Case ScaleModeConstants.vbCentimeters
            Case ScaleModeConstants.VbHimetric
                X = GetReverseValueX(X)
                Exit Select
        End Select

        Return X
    End Function

    Friend Function GetReverseValueX(ByVal VX As Single) As Single
        Dim dpi As Single = Graphics.FromHwnd(Me.Handle).DpiX

        Select Case Me.ScaleMode

            Case ScaleModeConstants.vbUser
                VX = VX * (Me.ScaleWidth / Me.ScaleImage.Width)
                Exit Select

            Case ScaleModeConstants.vbTwips
                VX = (VX / dpi) * 1440.0F
                Exit Select

            Case ScaleModeConstants.vbPoints
                VX = (VX / dpi) * 72.0F
                Exit Select

            Case ScaleModeConstants.vbPixels
                Exit Select

            Case ScaleModeConstants.vbCharacters
                VX = (VX * dpi) * 1440.0F / 120.0F
                Exit Select

            Case ScaleModeConstants.vbInches
                VX = VX / dpi
                Exit Select

            Case ScaleModeConstants.vbMillimeters
                VX = (VX / dpi) * 25.4F
                Exit Select

            Case ScaleModeConstants.vbCentimeters
                VX = (VX / dpi) * 2.54F
                Exit Select

            Case ScaleModeConstants.VbHimetric
                VX = (VX / dpi) * 2540.0F
                Exit Select
        End Select

        Return VX
    End Function

    Friend Function GetReverseArrayX(ByVal X() As Single) As Single()
        Dim TX(0) As Single
        Array.Resize(TX, X.Length)

        For i = 0 To X.Length - 1
            TX(i) = GetReverseX(X(i))
        Next

        Return TX
    End Function

    Friend Function GetReverseValueArrayX(ByVal VX() As Single) As Single()
        Dim TX(0) As Single
        Array.Resize(TX, VX.Length)

        For i = 0 To VX.Length - 1
            TX(i) = GetReverseValueX(VX(i))
        Next

        Return TX
    End Function

    Friend Function GetReverseY(ByVal Y As Single) As Single
        If Me.YAxialDirection = AxialDirectionConstants.YAxial.Top Then
            Y = Me.ScaleImage.Height - Y
        End If

        Select Case Me.ScaleMode

            Case ScaleModeConstants.vbUser
                Y = Y * (Me.ScaleHeight / Me.ScaleImage.Height)
                Y = Y + If(Me.YAxialDirection = AxialDirectionConstants.YAxial.Bottom, Me.ScaleTop, Me.ScaleTop - Me.ScaleHeight)
                Exit Select

            Case ScaleModeConstants.vbTwips
            Case ScaleModeConstants.vbPoints
            Case ScaleModeConstants.vbPixels
            Case ScaleModeConstants.vbCharacters
            Case ScaleModeConstants.vbInches
            Case ScaleModeConstants.vbMillimeters
            Case ScaleModeConstants.vbCentimeters
            Case ScaleModeConstants.VbHimetric
                Y = GetReverseValueY(Y)
                Exit Select
        End Select

        Return Y
    End Function

    Friend Function GetReverseValueY(ByVal VY As Single) As Single
        Dim dpi As Single = Graphics.FromHwnd(Me.Handle).DpiY

        Select Case Me.ScaleMode

            Case ScaleModeConstants.vbUser
                VY = VY * (Me.ScaleHeight / Me.ScaleImage.Height)
                Exit Select

            Case ScaleModeConstants.vbTwips
                VY = (VY / dpi) * 1440.0F
                Exit Select

            Case ScaleModeConstants.vbPoints
                VY = (VY / dpi) * 72.0F
                Exit Select

            Case ScaleModeConstants.vbPixels
                Exit Select

            Case ScaleModeConstants.vbCharacters
                VY = (VY * dpi) * 1440.0F / 120.0F
                Exit Select

            Case ScaleModeConstants.vbInches
                VY = VY / dpi
                Exit Select

            Case ScaleModeConstants.vbMillimeters
                VY = (VY / dpi) * 25.4F
                Exit Select

            Case ScaleModeConstants.vbCentimeters
                VY = (VY / dpi) * 2.54F
                Exit Select

            Case ScaleModeConstants.VbHimetric
                VY = (VY / dpi) * 2540.0F
                Exit Select
        End Select

        Return VY
    End Function

    Friend Function GetReverseArrayY(ByVal Y() As Single) As Single()
        Dim TY(0) As Single
        Array.Resize(TY, Y.Length)

        For i = 0 To Y.Length - 1
            TY(i) = GetReverseY(Y(i))
        Next

        Return TY
    End Function

    Friend Function GetReverseValueArrayY(ByVal VY() As Single) As Single()
        Dim TY(0) As Single
        Array.Resize(TY, VY.Length)

        For i = 0 To VY.Length - 1
            TY(i) = GetReverseValueY(VY(i))
        Next

        Return TY
    End Function

    Friend Function GetReversePoint(ByVal P As PointF) As PointF
        P.X = GetReverseX(P.X)
        P.Y = GetReverseY(P.Y)

        Return P
    End Function

    Friend Function GetReverseArrayPoint(ByVal P() As PointF) As PointF()
        Dim TP(0) As PointF
        Array.Resize(TP, P.Length)

        For i = 0 To P.Length - 1
            TP(i).X = GetReverseX(P(i).X)
            TP(i).Y = GetReverseY(P(i).Y)
        Next

        Return TP
    End Function

    Friend Function GetReverseValueSize(ByVal S As SizeF) As SizeF
        S.Width = GetReverseValueX(S.Width)
        S.Height = GetReverseValueY(S.Height)

        Return S
    End Function

    Friend Function GetReverseValueArraySize(ByVal S() As SizeF) As SizeF()
        Dim TS(0) As SizeF
        Array.Resize(TS, S.Length)

        For i = 0 To S.Length - 1
            TS(i).Width = GetReverseValueX(S(i).Width)
            TS(i).Height = GetReverseValueY(S(i).Height)
        Next

        Return TS
    End Function
#End Region

#Region "内部その他の変換"
    Friend Function GetStepX(ByVal X As Single) As Single
        Return Me.CurrentX + X
    End Function

    Friend Function GetStepY(ByVal Y As Single) As Single
        Return Me.CurrentY + Y
    End Function

    Friend Function GetStepArrayX(ByVal X() As Single) As Single()
        Dim TX(0) As Single
        Array.Resize(TX, X.Length)

        For i = 0 To X.Length - 1
            TX(i) = GetStepX(X(i))
        Next

        Return TX
    End Function

    Friend Function GetStepArrayY(ByVal Y() As Single) As Single()
        Dim TY(0) As Single
        Array.Resize(TY, Y.Length)

        For i = 0 To Y.Length - 1
            TY(i) = GetStepY(Y(i))
        Next

        Return TY
    End Function

    Friend Function GetStepPoint(ByVal P As PointF) As PointF
        P.X = GetStepX(P.X)
        P.Y = GetStepY(P.Y)

        Return P
    End Function

    Friend Function GetStepArrayPoint(ByVal P() As PointF) As PointF()
        Dim TP(0) As PointF
        Array.Resize(TP, P.Length)

        For i = 0 To P.Length - 1
            TP(i).X = GetStepX(P(i).X)
            TP(i).Y = GetStepY(P(i).Y)
        Next

        Return TP
    End Function

    Friend Function GetPartialArray(ByVal Value() As Single, ByVal StartIndex As Integer, ByVal EndIndex As Integer) As Single()
        Dim TValue(0) As Single
        Array.Resize(TValue, EndIndex - StartIndex + 1)

        Buffer.BlockCopy(Value, StartIndex * 4, TValue, 0, TValue.Length * 4)

        Return TValue
    End Function

    Friend Function GetPartialArray(ByVal Value() As PointF, ByVal StartIndex As Integer, ByVal EndIndex As Integer) As PointF()
        Dim TValue(0) As PointF
        Array.Resize(TValue, EndIndex - StartIndex + 1)

        Array.Copy(Value, StartIndex, TValue, 0, TValue.Length)

        Return TValue
    End Function

    Friend Function GetPartialArray(ByVal Value() As SizeF, ByVal StartIndex As Integer, ByVal EndIndex As Integer) As SizeF()
        Dim TValue(0) As SizeF
        Array.Resize(TValue, EndIndex - StartIndex + 1)

        Array.Copy(Value, StartIndex, TValue, 0, TValue.Length)

        Return TValue
    End Function
#End Region

#End Region

#End Region

#Region "提供メソッド(VB6.0に則っている)"

#Region "図形描画"
    ''' <summary>直線を描く</summary> 
    ''' <param name="X1">始点X</param>
    ''' <param name="Y1">始点Y</param>
    ''' <param name="X2">終点X 省略可 その場合始点Xの方を終点として扱う</param>
    ''' <param name="Y2">終点Y 省略可 その場合始点Yの方を終点として扱う</param>
    ''' <param name="DrawColor">色(ARGB形式) 省略可</param>
    ''' <param name="LineStyle">直線のスタイル 省略可 その場合Lineとなる</param>
    ''' <remarks> 
    ''' <example>メソッドの使用例 
    ''' <para>PictureBox.Line(X,Y) VB6.0のline -(X,Y)と同等</para> 
    ''' <para>PictureBox.Line(X1,Y1,X2,Y2) VB6.0のline (X1,Y1) - (X2,Y2)と同等</para> 
    ''' <para>PictureBox.Line(X1,Y1,X2,Y2,Information.QBColor(2),GraphicsStyle.LineStyle.BF) VB6.0のline (X1,Y1) - (X2,Y2),QBColor(2),BFと同等</para> 
    ''' </example></remarks> 
    Public Sub Line(ByVal X1 As Single, ByVal Y1 As Single, Optional ByVal X2 As Single = Single.NaN, Optional ByVal Y2 As Single = Single.NaN, Optional ByVal DrawColor As Long = &HFFFFFFFFF, Optional ByVal LineStyle As GraphicsStyle.LineStyle = GraphicsStyle.LineStyle.Line)
        If Me.TargetGraphics Is Nothing Then
            System.Windows.Forms.MessageBox.Show("Line : Starting_Initしてない状態・Interruptで中断している状態ではこのメソッドは使えません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        If Single.IsNaN(X2) Xor Single.IsNaN(Y2) Then
            System.Windows.Forms.MessageBox.Show("Line : X2とY2の値は同時に指定してください。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        If Single.IsNaN(X2) Then
            X2 = X1
            X1 = Me.CurrentX
            Y2 = Y1
            Y1 = Me.CurrentY
        End If

        Dim DrawPen As Pen = If(DrawColor = &HFFFFFFFFF, Me.DrawPen, DirectCast(Me.DrawPen.Clone(), System.Drawing.Pen))

        If DrawColor <> &HFFFFFFFFF Then
            DrawPen.Color = Color.FromArgb(CInt(DrawColor))
        End If

        If LineStyle = GraphicsStyle.LineStyle.Line Then
            Dim P1, P2 As PointF

            P1 = New PointF(GetX(X1), GetY(Y1))
            P2 = New PointF(GetX(X2), GetY(Y2))

            Me.TargetGraphics.DrawLine(DrawPen, P1, P2)
        Else
            Dim rect As RectangleF
            Dim W, H, T, L As Single

            L = If(GetX(X1) < GetX(X2), GetX(X1), GetX(X2))
            W = If(GetX(X1) < GetX(X2), GetX(X2) - GetX(X1), GetX(X1) - GetX(X2))
            T = If(GetY(Y1) < GetY(Y2), GetY(Y1), GetY(Y2))
            H = If(GetY(Y1) < GetY(Y2), GetY(Y2) - GetY(Y1), GetY(Y1) - GetY(Y2))

            rect = New RectangleF(L, T, W, H)

            If LineStyle = GraphicsStyle.LineStyle.FillRectangle Then
                Me.TargetGraphics.FillRectangle(New SolidBrush(DrawPen.Color), rect)

            Else
                If Me.FillStyle <> FillStyleConstants.vbFSTransparent Then

                    If Me.FillStyle = FillStyleConstants.vbFSSolid Then
                        Me.TargetGraphics.FillRectangle(New SolidBrush(Me.FillBrush.ForegroundColor), rect)
                    Else
                        Me.TargetGraphics.FillRectangle(Me.FillBrush, rect)
                    End If

                End If

                Me.TargetGraphics.DrawRectangle(DrawPen, rect.X, rect.Y, rect.Width, rect.Height)
            End If
        End If

        If DrawColor <> &HFFFFFFFFF Then
            DrawPen.Dispose()
            Me.DrawColor = DirectCast(CInt(DrawColor), ColorConstants)
        End If

        Me.CurrentX = X2
        Me.CurrentY = Y2

        TryAutoRedraw()
    End Sub

    ''' <summary>指定された4つ以上の点を繋ぐ曲線を描く</summary>
    ''' <param name="X">点の座標配列X</param>
    ''' <param name="Y">点の座標配列Y</param>
    ''' <param name="CurrentValueUsed">始点をCurrent～にするかどうか 省略可 その場合はFalseになる</param>
    ''' <param name="DrawColor">色(ARGB形式) 省略可</param>
    ''' <param name="Tension">曲線の滑らかさを0～1で指定する 省略可 その場合0.5になる</param>
    ''' <param name="CurveStyle">曲線のスタイル 省略可 その場合Curveとなる</param>
    ''' <remarks>
    ''' <example>メソッドの使用例 
    ''' <para>PictureBox.Curve(X,Y)</para>
    ''' <para>PictureBox.Curve(X,Y,True,Information.QBColor(2),1.0)</para>
    ''' <para>PictureBox.Curve(X,Y, ,Information.QBColor(2), ,GraphicsStyle.CurveStyle.FillCurve)</para>
    ''' </example></remarks>
    Public Sub Curve(ByVal X() As Single, ByVal Y() As Single, Optional ByVal CurrentValueUsed As Boolean = False, Optional ByVal DrawColor As Long = &HFFFFFFFFF, Optional ByVal Tension As Single = 0.5F, Optional ByVal CurveStyle As GraphicsStyle.CurveStyle = GraphicsStyle.CurveStyle.Curve)
        If X.Length <> Y.Length Then
            System.Windows.Forms.MessageBox.Show("Curve : XとYの値の数が合いません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        Dim P(0) As PointF
        Array.Resize(P, X.Length)

        For i = 0 To P.Length - 1
            P(i).X = X(i)
            P(i).Y = Y(i)
        Next

        Curve(P, CurrentValueUsed, DrawColor, Tension, CurveStyle)
    End Sub

    ''' <summary>指定された4つ以上の点を繋ぐ曲線を描く</summary>
    ''' <param name="P">点の座標配列</param>
    ''' <param name="CurrentValueUsed">始点をCurrent～にするかどうか 省略可 その場合はFalseになる</param>
    ''' <param name="DrawColor">色(ARGB形式) 省略可</param>
    ''' <param name="Tension">曲線の滑らかさを0～1で指定する 省略可 その場合0.5になる</param>
    ''' <param name="CurveStyle">曲線のスタイル 省略可 その場合Curveとなる</param>
    ''' <remarks>
    ''' <example>メソッドの使用例 
    ''' <para>PictureBox.Curve(P)</para>
    ''' <para>PictureBox.Curve(P,True,Information.QBColor(2),1.0)</para>
    ''' <para>PictureBox.Curve(P, ,Information.QBColor(2), ,GraphicsStyle.CurveStyle.FillCurve)</para>
    ''' </example></remarks>
    Public Sub Curve(ByVal P() As PointF, Optional ByVal CurrentValueUsed As Boolean = False, Optional ByVal DrawColor As Long = &HFFFFFFFFF, Optional ByVal Tension As Single = 0.5F, Optional ByVal CurveStyle As GraphicsStyle.CurveStyle = GraphicsStyle.CurveStyle.Curve)
        If If(CurrentValueUsed, P.Length < 3, P.Length < 4) Then
            System.Windows.Forms.MessageBox.Show("Curve : 点の数が4つ以下では曲線を定められません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        If CurrentValueUsed Then
            Array.Resize(P, P.Length + 1)

            For i = P.Length - 1 To 1
                P(i) = P(i - 1)
            Next

            P(0).X = Me.CurrentX
            P(0).Y = Me.CurrentY
        End If

        Dim DrawPen As Pen = If(DrawColor = &HFFFFFFFFF, Me.DrawPen, DirectCast(Me.DrawPen.Clone(), System.Drawing.Pen))

        If DrawColor <> &HFFFFFFFFF Then
            DrawPen.Color = Color.FromArgb(CInt(DrawColor))
        End If

        If CurveStyle = GraphicsStyle.CurveStyle.Curve Then
            Me.TargetGraphics.DrawCurve(DrawPen, GetArrayPoint(P), Tension)

        ElseIf CurveStyle = GraphicsStyle.CurveStyle.FillAlternateCurve OrElse CurveStyle = GraphicsStyle.CurveStyle.FillWindingCurve Then
            Me.TargetGraphics.FillClosedCurve(New SolidBrush(DrawPen.Color), GetArrayPoint(P), If(CurveStyle = GraphicsStyle.CurveStyle.FillAlternateCurve, Drawing2D.FillMode.Alternate, Drawing2D.FillMode.Winding), Tension)

        Else
            If Me.FillStyle <> FillStyleConstants.vbFSTransparent Then

                If Me.FillStyle = FillStyleConstants.vbFSSolid Then
                    Me.TargetGraphics.FillClosedCurve(New SolidBrush(Me.FillBrush.ForegroundColor), GetArrayPoint(P), If(CurveStyle = GraphicsStyle.CurveStyle.CloseAlternateCurve, Drawing2D.FillMode.Alternate, Drawing2D.FillMode.Winding), Tension)
                Else
                    Me.TargetGraphics.FillClosedCurve(Me.FillBrush, GetArrayPoint(P), If(CurveStyle = GraphicsStyle.CurveStyle.CloseAlternateCurve, Drawing2D.FillMode.Alternate, Drawing2D.FillMode.Winding), Tension)
                End If

            End If

            Me.TargetGraphics.DrawClosedCurve(DrawPen, GetArrayPoint(P), Tension, If(CurveStyle = GraphicsStyle.CurveStyle.CloseAlternateCurve, Drawing2D.FillMode.Alternate, Drawing2D.FillMode.Winding))
        End If

        If DrawColor <> &HFFFFFFFFF Then
            DrawPen.Dispose()
            Me.DrawColor = DirectCast(CInt(DrawColor), ColorConstants)
        End If

        Me.CurrentX = P(P.Length - 1).X
        Me.CurrentY = P(P.Length - 1).Y

        TryAutoRedraw()
    End Sub

    ''' <summary>点を描く</summary> 
    ''' <param name="X">中心の座標X</param> 
    ''' <param name="Y">中心の座標Y</param> 
    ''' <param name="DrawColor">色(ARGB形式) 省略可</param> 
    ''' <remarks> 
    ''' <example>メソッドの使用例 
    ''' <para>PictureBox.PSet(X,Y) VB6.0のPSet (X,Y)と同等</para> 
    ''' <para>PictureBox.PSet(X,Y,Information.QBColor(3)) VB6.0のPSet (X,Y),QBColor(3)と同等</para> 
    ''' </example></remarks> 
    Public Sub PSet(ByVal X As Single, ByVal Y As Single, Optional ByVal DrawColor As Long = &HFFFFFFFFF)
        If Me.TargetGraphics Is Nothing Then
            System.Windows.Forms.MessageBox.Show("PSet : Starting_Initしてない状態・Interruptで中断している状態ではこのメソッドは使えません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        Dim tcolor As Color

        If DrawColor = &HFFFFFFFFF Then
            DrawColor = Me.DrawPen.Color.ToArgb()
        End If

        tcolor = System.Drawing.Color.FromArgb(CInt(DrawColor))

        Me.TargetGraphics.FillEllipse(New SolidBrush(tcolor), GetX(X) - 1.5F, GetY(Y) - 1.5F, 3.0F, 3.0F)

        Me.CurrentX = X
        Me.CurrentY = Y

        If DrawColor <> &HFFFFFFFFF Then
            Me.DrawColor = DirectCast(CInt(DrawColor), ColorConstants)
        End If

        TryAutoRedraw()
    End Sub

    ''' <summary>円を描く(角度指定は0～2π開始のEndRadで終了角度とその方向を決めるプラスが左回り)</summary> 
    ''' <param name="X">中心の座標X</param> 
    ''' <param name="Y">中心の座標Y</param> 
    ''' <param name="R">半径を指定 0.0より大きい値(X軸の単位)</param>
    ''' <param name="DrawColor">色(ARGB形式) 省略可</param>
    ''' <param name="StartRad">開始角度(ラジアン) 省略可 その場合0となる</param>
    ''' <param name="EndRad">終了角度(ラジアン) 省略可 その場合2πとなる</param> 
    ''' <param name="Aspect">アスペクト比(縦/横) 省略可 その場合1となる</param>
    ''' <param name="CircleStyle">円のスタイル(VB6.0での円弧・扇形の指定はここで) 省略可 その場合Arcとなる</param>
    ''' <remarks> 
    ''' <example>メソッドの使用例
    ''' <para>PictureBox.Circle(X,Y,R) VB6.0のCircle (X,Y),Rと同等</para> 
    ''' <para>PictureBox.Circle(X,Y,R,C, , ,ASP) VB6.0のCircle (X,Y),R,C, , ,ASPと同等(C:色 ASP:アスペクト比)</para> 
    ''' </example></remarks> 
    Public Sub Circle(ByVal X As Single, ByVal Y As Single, ByVal R As Single, Optional ByVal DrawColor As Long = &HFFFFFFFFF, Optional ByVal StartRad As Single = 0, Optional ByVal EndRad As Single = 2 * Math.PI, Optional ByVal Aspect As Single = 1, Optional ByVal CircleStyle As GraphicsStyle.CircleStyle = GraphicsStyle.CircleStyle.Arc)
        If Me.TargetGraphics Is Nothing Then
            System.Windows.Forms.MessageBox.Show("Crcle ： Starting_Initしてない状態・Interruptで中断している状態ではこのメソッドは使えません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        If R <= 0.0 Then
            System.Windows.Forms.MessageBox.Show("Crcle ： Rの値は0.0より大きい値で指定してください。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        Dim SHX, SHY As Single
        Dim DrawPen As Pen = If(DrawColor = &HFFFFFFFFF, Me.DrawPen, DirectCast(Me.DrawPen.Clone(), System.Drawing.Pen))

        If DrawColor <> &HFFFFFFFFF Then
            DrawPen.Color = Color.FromArgb(CInt(DrawColor))
        End If

        SHX = GetValueX(If(Aspect < 1, R / Aspect, R))
        SHY = GetValueX(If(Aspect > 1, R * Aspect, R))

        If Math.Abs(EndRad - StartRad) < (2 * Math.PI) Then
            Dim flag As Boolean = False

            While StartRad < 0
                StartRad += CSng(2 * Math.PI)
            End While

            While EndRad < 0
                EndRad += CSng(2 * Math.PI)
                flag = True
            End While

            EndRad = EndRad - StartRad

            If EndRad < 0 AndAlso flag = False Then
                EndRad += CSng(2 * Math.PI)
            ElseIf EndRad > 0 AndAlso flag = True Then
                EndRad -= CSng(2 * Math.PI)
            End If

            StartRad = CSng(-StartRad * 180.0 / Math.PI)
            EndRad = CSng(-EndRad * 180.0 / Math.PI)

        Else
            StartRad = 0
            EndRad = 360
        End If

        If CircleStyle = GraphicsStyle.CircleStyle.Arc Then
            Me.TargetGraphics.DrawArc(DrawPen, GetX(X) - SHX, GetY(Y) - SHY, SHX * 2, SHY * 2, StartRad, EndRad)
        ElseIf CircleStyle = GraphicsStyle.CircleStyle.FillPie Then
            Me.TargetGraphics.FillPie(New SolidBrush(DrawPen.Color), GetX(X) - SHX, GetY(Y) - SHY, SHX * 2, SHY * 2, StartRad, EndRad)
        Else
            If Me.FillStyle <> FillStyleConstants.vbFSTransparent Then

                If Me.FillStyle = FillStyleConstants.vbFSSolid Then
                    Me.TargetGraphics.FillPie(New SolidBrush(Me.FillBrush.ForegroundColor), GetX(X) - SHX, GetY(Y) - SHY, SHX * 2, SHY * 2, StartRad, EndRad)
                Else
                    Me.TargetGraphics.FillPie(Me.FillBrush, GetX(X) - SHX, GetY(Y) - SHY, SHX * 2, SHY * 2, StartRad, EndRad)
                End If

            End If

            If Math.Abs(EndRad) >= 360 Then
                Me.TargetGraphics.DrawEllipse(DrawPen, GetX(X) - SHX, GetY(Y) - SHY, SHX * 2, SHY * 2)
            Else
                Me.TargetGraphics.DrawPie(DrawPen, GetX(X) - SHX, GetY(Y) - SHY, SHX * 2, SHY * 2, StartRad, EndRad)
            End If
        End If

        If DrawColor <> &HFFFFFFFFF Then
            DrawPen.Dispose()
            Me.DrawColor = DirectCast(CInt(DrawColor), ColorConstants)
        End If

        Me.CurrentX = X
        Me.CurrentY = Y

        TryAutoRedraw()
    End Sub
#End Region

#Region "テキスト・画像描画"
    ''' <summary>文字列を描く(フォントはプロパティDrawFont、フォントカラーはプロパティDrawColorまたは指定した色に依存)</summary>
    ''' <param name="DrawString">描きたい文字列</param>
    ''' <param name="X">文字列の左上端座標のX 省略可 その場合CurrentXの値を使用</param>
    ''' <param name="Y">文字列の左上端座標のY 省略可 その場合CurrentYの値を使用</param>
    ''' <param name="DrawColor">色(ARGB形式) 省略可</param>
    ''' <remarks> 
    ''' <example>メソッドの使用例
    ''' <para>PictureBox.Print("ABC") VB6.0のPrint "ABC"同等(Curent～で予めX,Yを決めておく)</para> 
    ''' </example></remarks> 
    Public Sub Print(ByVal DrawString As String, Optional ByVal X As Single = Single.NaN, Optional ByVal Y As Single = Single.NaN, Optional ByVal DrawColor As Long = &HFFFFFFFFF)
        If Me.TargetGraphics Is Nothing Then
            System.Windows.Forms.MessageBox.Show("Print : Starting_Initしてない状態・Interruptで中断している状態ではこのメソッドは使えません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        If Single.IsNaN(X) Xor Single.IsNaN(Y) Then
            System.Windows.Forms.MessageBox.Show("Print : XとYの値は同時に指定してください。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        If Single.IsNaN(X) Then
            X = Me.CurrentX
            Y = Me.CurrentY
        End If

        Dim br As Brush = New SolidBrush(If(DrawColor <> &HFFFFFFFFF, Me.DrawPen.Color, Color.FromArgb(CInt(DrawColor))))

        Me.TargetGraphics.DrawString(DrawString, Me.DrawFont, br, GetX(X), GetY(Y))

        br.Dispose()

        Me.CurrentX = X
        Me.CurrentY = Y

        If DrawColor <> &HFFFFFFFFF Then
            Me.DrawColor = DirectCast(CInt(DrawColor), ColorConstants)
        End If

        TryAutoRedraw()
    End Sub

#Region "PaintPictureを再現するためのWindowsAPIのインポート"
    ''' <summary>コピー元の長方形からコピー先の長方形へビットマップをコピーする</summary>
    ''' <param name="hDestDC">コピー先のデバインコンテキストハンドル</param>
    ''' <param name="nDestLeft">コピー先の描画する左端</param>
    ''' <param name="nDestTop">コピー先の描画する上端</param>
    ''' <param name="nDestWidth">コピー先の描画する幅</param>
    ''' <param name="nDestHeight">コピー先の描画する高さ</param>
    ''' <param name="hSrcDC">コピー元のデバインコンテキストハンドル</param>
    ''' <param name="nSrcLeft">コピー元の取得範囲の左端</param>
    ''' <param name="nSrcTop">コピー元の取得範囲の上端</param>
    ''' <param name="nSrcWidth">コピー元の取得範囲の幅</param>
    ''' <param name="nSrcHeight">コピー元の取得範囲の高さ</param>
    ''' <param name="dwRop">コピー時のラスターオペレーション</param>
    ''' <returns>成功したかどうか 成功するとTrueが戻る</returns>
    <System.Runtime.InteropServices.DllImport("gdi32.dll")> _
    Private Shared Function StretchBlt( _
        ByVal hDestDC As IntPtr, _
        ByVal nDestLeft As Integer, ByVal nDestTop As Integer, _
        ByVal nDestWidth As Integer, ByVal nDestHeight As Integer, _
        ByVal hSrcDC As IntPtr, _
        ByVal nSrcLeft As Integer, ByVal nSrcTop As Integer, _
        ByVal nSrcWidth As Integer, ByVal nSrcHeight As Integer, _
        ByVal dwRop As RasterOpConstants) As Boolean
    End Function

    ''' <summary>伸縮描画するAPIの伸縮モードを指定する</summary>
    ''' <param name="hdc">StretchBltでのコピー先のデバインコンテキストハンドル</param>
    ''' <param name="iStertchMode">伸縮モード</param>
    ''' <returns>前の伸縮モード</returns>
    <System.Runtime.InteropServices.DllImport("gdi32.dll")> _
    Private Shared Function SetStretchBltMode(ByVal hdc As IntPtr, ByVal iStertchMode As StretchMode) As StretchMode
    End Function

    ''' <summary>指定されたデバイスコンテキストで、指定された 1 個のオブジェクトを選択する</summary>
    ''' <param name="hdc">対象のデバインコンテキストハンドル</param>
    ''' <param name="hgdiobj">指定するオブジェクトハンドル</param>
    ''' <returns>置き換えが発生する前のオブジェクトのハンドル</returns>
    <System.Runtime.InteropServices.DllImport("gdi32.dll")> _
    Private Shared Function SelectObject(ByVal hdc As IntPtr, ByVal hgdiobj As IntPtr) As IntPtr
    End Function

    ''' <summary>オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放する</summary>
    ''' <param name="hObject">対象のオブジェクトハンドル</param>
    ''' <returns>成功したかどうか 成功するとTrueが戻る</returns>
    <System.Runtime.InteropServices.DllImport("gdi32.dll")> _
    Private Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean
    End Function

    ''' <summary>SetStretchBltModeに使用する伸縮モード</summary>
    Private Enum StretchMode As Integer
        ''' <summary>既存のカラー値と AND 演算する。(黒 > 白)</summary>
        BLACKONWHITE = 1
        ''' <summary>既存のカラー値と OR 演算する。(白 > 黒)</summary>
        WHITEONBLACK = 2
        ''' <summary>コピー先のピクセルをコピー元のピクセルで置換する</summary>
        COLORONCOLOR = 3
        ''' <summary>コピー先のピクセルの平均カラー値をとる</summary>
        HALFTONE = 4
        ''' <summary>HALFTONE と同じ</summary>
        MAXSTRETCHBLTMODE = 4
    End Enum
#End Region

    ''' <summary>イメージを描画する</summary>
    ''' <param name="Source">描画するイメージ</param>
    ''' <param name="X">描画したい場所の左上端座標X(ScaleMode単位)</param>
    ''' <param name="Y">描画したい場所の左上端座標Y(ScaleMode単位)</param>
    ''' <param name="Width">描画したい場所範囲の幅(ScaleMode単位) 省略可</param>
    ''' <param name="Height">描画したい場所範囲の高さ(ScaleMode単位) 省略可</param>
    ''' <param name="SrcX">描画したいイメージの部分範囲の左上端座標X(ピクセル単位) 省略可</param>
    ''' <param name="SrcY">描画したいイメージの部分範囲の左上端座標Y(ピクセル単位) 省略可</param>
    ''' <param name="SrcWidth">描画したいイメージの部分範囲の幅(ピクセル単位) マイナスの値で反転可 省略可</param>
    ''' <param name="SrcHeight">描画したいイメージの部分範囲の高さ(ピクセル単位) マイナスの値で反転可 省略可</param>
    ''' <param name="RasterOP">ラスターオペレーション 省略可 その場合vbSrcCopyとなる 半透明画像はvbSrcCopy以外では扱えない(画像がぼける) 不透明度と同時に指定は不可、同時指定の場合不透明度が優先される</param>
    ''' <param name="SourceAlpha">描画したいイメージの不透明度(0.0～1.0) 省略化 その場合1.0となる ラスターオペレーションと同時に指定は不可、同時指定の場合不透明度が優先される</param>
    ''' <remarks>
    ''' <example>メソッドの使用例
    ''' <para>PictureBox.PaintPicture(img,X,Y) VB6.0のPaintPicture img,X,Yと同等</para>
    ''' <para>PictureBox.PaintPicture(img,X1,Y1,W1,H1,X2,Y2,W2,H2) VB6.0のPaintPicture img,X1,Y1,W1,H1,X2,Y2,W2,H2と同等</para>
    ''' </example></remarks>
    Public Sub PaintPicture(ByVal Source As System.Drawing.Image, ByVal X As Single, ByVal Y As Single, Optional ByVal Width As Single = Single.NaN, Optional ByVal Height As Single = Single.NaN, Optional ByVal SrcX As Integer = Integer.MinValue, Optional ByVal SrcY As Integer = Integer.MinValue, Optional ByVal SrcWidth As Integer = Integer.MinValue, Optional ByVal SrcHeight As Integer = Integer.MinValue, Optional ByVal RasterOP As RasterOpConstants = RasterOpConstants.vbSrcCopy, Optional ByVal SourceAlpha As Single = 1.0F)
        If Me.TargetGraphics Is Nothing Then
            System.Windows.Forms.MessageBox.Show("PaintPicture : Starting_Initしてない状態・Interruptで中断している状態ではこのメソッドは使えません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        If 0.0F > SourceAlpha OrElse SourceAlpha > 1.0F Then
            System.Windows.Forms.MessageBox.Show("PaintPicture : SourceAlphaの値は0.0～1.0の間です。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        If (Single.IsNaN(Width) Xor Single.IsNaN(Height)) OrElse (SrcWidth = Integer.MinValue Xor SrcHeight = Integer.MinValue) Then
            System.Windows.Forms.MessageBox.Show("PaintPicture : WidthとHeightやSrcWidthとSrcHeightの値は同時に指定してください。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        ElseIf SrcX = Integer.MinValue Xor SrcY = Integer.MinValue Then
            System.Windows.Forms.MessageBox.Show("PaintPicture : SrcXとSrcYの値は同時に指定してください。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        Width = If(Single.IsNaN(Width), Me.ScaleImage.Width, GetValueX(Width))
        Height = If(Single.IsNaN(Height), Me.ScaleImage.Height, GetValueY(Height))

        SrcX = If(SrcX = Integer.MinValue, 0, SrcX)
        SrcY = If(SrcY = Integer.MinValue, 0, SrcY)
        SrcWidth = If(SrcWidth = Integer.MinValue, Source.Width, SrcWidth)
        SrcHeight = If(SrcHeight = Integer.MinValue, Source.Height, SrcHeight)

        If Width <= 0.0 OrElse Height <= 0.0 Then
            System.Windows.Forms.MessageBox.Show("PaintPicture : WidthとHeightはプラスの値で表記してください。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        ElseIf SrcWidth = 0 OrElse SrcHeight = 0 Then
            System.Windows.Forms.MessageBox.Show("PaintPicture : SrcWidthとSrcHeightに0は指定できません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        If RasterOP = RasterOpConstants.vbSrcCopy OrElse SourceAlpha <> 1.0F Then
            Dim cm As New System.Drawing.Imaging.ColorMatrix()
            cm.Matrix00 = 1
            cm.Matrix11 = 1
            cm.Matrix22 = 1
            cm.Matrix33 = SourceAlpha
            cm.Matrix44 = 1

            Dim ia As New System.Drawing.Imaging.ImageAttributes()
            ia.SetColorMatrix(cm)

            Me.TargetGraphics.DrawImage(Source, New Rectangle(CInt(GetX(X)), CInt(GetY(Y)), CInt(Width), CInt(Height)), SrcX, SrcY, SrcWidth, SrcHeight, GraphicsUnit.Pixel, ia)
            ia.Dispose()
        Else
            Dim grImg As Graphics = Graphics.FromImage(Source)
            Dim hDC As IntPtr = Me.TargetGraphics.GetHdc()
            Dim imgDC As IntPtr = grImg.GetHdc()
            Dim hBitmap As IntPtr = DirectCast(Source, System.Drawing.Bitmap).GetHbitmap()
            Dim oldBitmap As IntPtr = SelectObject(imgDC, hBitmap)

            'StretchBltで描画対象にRasterOPに従って伸縮部分描画する
            SetStretchBltMode(hDC, If(Me.DrawCompositingMode = Drawing2D.CompositingMode.SourceOver, StretchMode.MAXSTRETCHBLTMODE, StretchMode.COLORONCOLOR))
            StretchBlt(hDC, CInt(GetX(X)), CInt(GetY(Y)), CInt(Width), CInt(Height), imgDC, SrcX, SrcY, SrcWidth, SrcHeight, RasterOP)

            SelectObject(imgDC, oldBitmap)
            DeleteObject(hBitmap)

            Me.TargetGraphics.ReleaseHdc(hDC)
            grImg.ReleaseHdc(imgDC)

            grImg.Dispose()
        End If

        Me.CurrentX = X
        Me.CurrentY = Y
        TryAutoRedraw()
    End Sub
#End Region

#Region "その他"
    ''' <summary>画面消去</summary>
    Public Sub Cls()
        If Me.TargetGraphics Is Nothing Then
            System.Windows.Forms.MessageBox.Show("Cls : Starting_Initしてない状態・Interruptで中断している状態ではこのメソッドは使えません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        Dim tmp As Color = Color.FromArgb(0, 0, 0, 0)
        Me.TargetGraphics.Clear(tmp)

        TryAutoRedraw()
    End Sub

    ''' <summary>オブジェクトを移動する (スクリーン座標系、ピクセル単位)</summary>
    ''' <param name="Left">オーナー座標(通常はForm内の座標)での左端の座標X</param>
    ''' <param name="Top">オーナー座標(通常はForm内の座標)での上端の座標Y</param>
    ''' <param name="Width">オブジェクトの幅</param>
    ''' <param name="Height">オブジェクトの高さ</param>
    ''' <remarks>
    ''' <example>メソッド使用例
    ''' <para>PictureBox.MoveObject(10,10,500,500) VB6.0のMove 10,10,500,500 とほぼ同等(単位はピクセルのみになる：オーナー座標(10,10)に500×500の大きさで再配置する)</para>
    ''' </example></remarks>
    Public Sub MoveObject(ByVal Left As Integer, ByVal Top As Integer, ByVal Width As Integer, ByVal Height As Integer)
        If Width < 0 OrElse Height < 0 Then
            System.Windows.Forms.MessageBox.Show("MoveObject : WidthとHeightにマイナスの値は指定できません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        MyBase.Left = Left
        MyBase.Top = Top
        MyBase.Width = Width
        MyBase.Height = Height
    End Sub

    ''' <summary>指定した座標の色を返す(ARGB形式)</summary> 
    ''' <param name="X">座標X</param> 
    ''' <param name="Y">座標Y</param> 
    ''' <returns>色(ARGB形式)</returns>
    ''' <remarks><example>メソッドの使用例<para>PictureBox.Point(10,10) VB6.0のPoint 10,10 と同等</para></example></remarks>
    Public Function Point(ByVal X As Single, ByVal Y As Single) As Integer
        Return Me.ScaleImage.GetPixel(CInt(GetX(X) + 0.5F), CInt(GetY(Y) + 0.5F)).ToArgb()
    End Function

    ''' <summary>現在のフォントである文字列をプリントしたときの文字列の幅を取得する</summary>
    ''' <param name="Str">幅が知りたい文字列</param>
    ''' <returns>Strをプリントした時の幅</returns>
    ''' <remarks>
    ''' <example>メソッドの使用例
    ''' <para>PictureBox.TextWidth("ABC") VB6.0のTextWidth "ABC" と同等</para>
    ''' </example></remarks>
    Public Function TextWidth(ByVal Str As String) As Single
        Return GetReverseValueX(Me.TargetGraphics.MeasureString(Str, Me.DrawFont).Width)
    End Function

    ''' <summary>現在のフォントである文字列をプリントしたときの文字列の高さを取得する</summary>
    ''' <param name="Str">高さが知りたい文字列</param>
    ''' <returns>Strをプリントした時の高さ</returns>
    ''' <remarks>
    ''' <example>メソッドの使用例
    ''' <para>PictureBox.TextHeight("ABC") VB6.0のTextHeight "ABC" と同等</para>
    ''' </example></remarks>
    Public Function TextHeight(ByVal Str As String) As Single
        Return GetReverseValueY(Me.TargetGraphics.MeasureString(Str, Me.DrawFont).Height)
    End Function
#End Region

#End Region

End Class
#End Region

#Region "PictureBoxUnitConvertクラス"
''' <summary>単位変換メソッドのみを管理するクラス VB60.PictureBoxから単位変換メソッドのみを抜き出してインスタンスを作る</summary>
''' <remarks>クラスの利用方法(VB.NET)
''' <para>Dim A As VB60.PictureBox = New VB60.PictureBox()</para>
''' <para>A.YAxialDirection = AxialDirectionConstants.YAxial.Top等</para>
''' <para>A.Init_Scale(-1,1,2,2) →数学座標の-1～1の幅高さそれぞれ2の仮想座標の設定</para>
''' <para>A.Starting_Init()</para>
''' <para>Dim B As VB60.PictureBoxUnitConvert = New VB60.PictureBoxUnitConvert(A)</para>
''' <para>Dim C As Single = B.GetX(0)等と使う</para>
''' <para> </para>
''' <para>以下単位変換メソッドの説明</para>
''' <para>単位変換メソッドはGet～という名前で定義されている</para>
''' <para>GetXなどはScaleModeの座標系からピクセル単位のスクリーン座標系に変換する通常メソッド</para>
''' <para>GetReverseXなどReverseが付くと先ほどの通常変換の逆変換になる</para>
''' <para>GetValueXなどValueが付くものは原点関係なしで幅や高さを取得する変換メソッドである</para>
''' <para>GetArrayXなどArrayが付くものは配列に関する変換メソッドである</para>
''' <para>Get～の一番右側が取得する値の種類を表す(種類：X,Y,Point,Size,Array)</para>
''' <para>GetStepXなどの特殊変換も存在する</para>
''' <para>省略はGetを除いた単語の先頭のアルファベットを並べて物である</para>
''' <para>例えばGetReverseValueArraySizeの省略はRVASである</para>
''' </remarks>
<System.ComponentModel.ToolboxItem(False)> _
Public Class PictureBoxUnitConvert

#Region "フィールドとコンストラクタ"
    ''' <summary>単位変換の対象となるVB60.PictureBox</summary>
    Private Target As PictureBox
    ''' <summary>単位変換メソッドの詳細をメソッド一覧に表示するかどうかのパラメータ</summary>
    Private Const EBState As EditorBrowsableState = EditorBrowsableState.Advanced

    ''' <summary>新しくインスタンスを作る</summary>
    ''' <param name="Target">単位変換の対象となるVB60.PictureBox</param>
    Public Sub New(ByVal Target As PictureBox)
        If Target Is Nothing OrElse Not Target.StartEnabled Then
            System.Windows.Forms.MessageBox.Show("コンストラクタ : 引数のVB60.PictureBoxがNothing(null)またはStarting_Initをしていない状態でこのクラスのインスタンスは作れません。", "エラー", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
            Exit Sub
        End If

        Me.Target = Target
    End Sub

    ''' <summary>通常に使えるがエディタからは見えない</summary> 
    ''' <returns>Objectクラスの静的Equals</returns> 
    <EditorBrowsable(EditorBrowsableState.Never)> _
    Public Shared Shadows Function Equals(ByVal objA As Object, ByVal objB As Object) As Boolean
        Return [Object].Equals(objA, objB)
    End Function

    ''' <summary>通常に使えるがエディタからは見えない</summary> 
    ''' <returns>Objectクラスの静的ReferenceEquals</returns> 
    <EditorBrowsable(EditorBrowsableState.Never)> _
    Public Shared Shadows Function ReferenceEquals(ByVal objA As Object, ByVal objB As Object) As Boolean
        Return [Object].ReferenceEquals(objA, objB)
    End Function

    ''' <summary>通常に使えるがエディタからは見えない</summary> 
    ''' <returns>ObjectクラスのGetType</returns> 
    <EditorBrowsable(EditorBrowsableState.Never)> _
    Public Shadows Function [GetType]() As Type
        Return MyBase.[GetType]()
    End Function

    ''' <summary>通常に使えるがエディタからは見えない</summary> 
    ''' <returns>ObjectクラスのEquals</returns> 
    <EditorBrowsable(EditorBrowsableState.Never)> _
    Public Shadows Function Equals(ByVal obj As Object) As Boolean
        Return MyBase.Equals(obj)
    End Function

    ''' <summary>通常に使えるがエディタからは見えない</summary> 
    ''' <returns>ObjectクラスのGetHashCode</returns> 
    <EditorBrowsable(EditorBrowsableState.Never)> _
    Public Overloads Function GetHashCode() As Integer
        Return MyBase.GetHashCode()
    End Function

    ''' <summary>通常に使えるがエディタからは見えない</summary> 
    ''' <returns>ObjectクラスのToString</returns> 
    <EditorBrowsable(EditorBrowsableState.Never)> _
    Public Overloads Function ToString() As String
        Return MyBase.ToString()
    End Function
#End Region

#Region "単位変換メソッド"

#Region "通常変換"
    ''' <summary>GetX() : ScaleModeに従ってある単位での座標Xをピクセル単位での座標Xに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での座標値</param> 
    ''' <returns>ピクセル単位の座標値</returns> 
    ''' <remarks>内部アクセス名<para>GetX()</para></remarks>
    Public Function X(ByVal Value As Single) As Single
        Return GetX(Value)
    End Function

    ''' <summary>GetY() : ScaleModeに従ってある単位での座標Yをピクセル単位での座標Yに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での座標値</param> 
    ''' <returns>ピクセル単位の座標値</returns> 
    ''' <remarks>内部アクセス名<para>GetY()</para></remarks>
    Public Function Y(ByVal Value As Single) As Single
        Return GetY(Value)
    End Function

    ''' <summary>GetArrayX() : ScaleModeに従ってある単位での座標配列Xをピクセル単位での座標配列Xに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での座標値配列</param> 
    ''' <returns>ピクセル単位の座標値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetArrayX()</para></remarks>
    Public Function AX(ByVal Value() As Single) As Single()
        Return GetArrayX(Value)
    End Function

    ''' <summary>GetArrayY() : ScaleModeに従ってある単位での座標配列Yをピクセル単位での座標配列Yに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での座標値配列</param> 
    ''' <returns>ピクセル単位の座標値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetArrayY()</para></remarks>
    Public Function AY(ByVal Value() As Single) As Single()
        Return GetArrayY(Value)
    End Function

    ''' <summary>GetValueX() : ScaleModeに従ってある単位の値Xをピクセル単位の値Xに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での値</param> 
    ''' <returns>ピクセル単位の値</returns> 
    ''' <remarks>内部アクセス名<para>GetValueX()</para></remarks>
    Public Function VX(ByVal Value As Single) As Single
        Return GetValueX(Value)
    End Function

    ''' <summary>GetValueY() : ScaleModeに従ってある単位の値Yをピクセル単位の値Yに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での値</param> 
    ''' <returns>ピクセル単位の値</returns> 
    ''' <remarks>内部アクセス名<para>GetValueY()</para></remarks>
    Public Function VY(ByVal Value As Single) As Single
        Return GetValueY(Value)
    End Function

    ''' <summary>GetValueArrayX() : ScaleModeに従ってある単位の値配列Xをピクセル単位の値配列Xに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での値配列</param> 
    ''' <returns>ピクセル単位の値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetValueArrayX()</para></remarks>
    Public Function VAX(ByVal Value() As Single) As Single()
        Return GetValueArrayX(Value)
    End Function

    ''' <summary>GetValueArrayY() : ScaleModeに従ってある単位の値配列Yをピクセル単位の値配列Yに変換して返す</summary> 
    ''' <param name="Value">変換前の単位での値配列</param> 
    ''' <returns>ピクセル単位の値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetValueArrayY()</para></remarks>
    Public Function VAY(ByVal Value() As Single) As Single()
        Return GetValueArrayY(Value)
    End Function

    ''' <summary>GetPoint() : ScaleModeに従ってある単位の座標点をピクセル単位の座標点に変換して返す</summary>
    ''' <param name="Value">変換前の単位での座標点</param>
    ''' <returns>ピクセル単位の座標点</returns>
    ''' <remarks>内部アクセス名<para>GetPoint()</para></remarks>
    Public Function P(ByVal Value As PointF) As PointF
        Return GetPoint(Value)
    End Function

    ''' <summary>GetArrayPoint() : ScaleModeに従ってある単位の座標点配列をピクセル単位の座標点配列に変換して返す</summary>
    ''' <param name="Value">変換前の単位での座標点配列</param>
    ''' <returns>ピクセル単位の座標点配列</returns>
    ''' <remarks>内部アクセス名<para>GetArrayPoint()</para></remarks>
    Public Function AP(ByVal Value() As PointF) As PointF()
        Return GetArrayPoint(Value)
    End Function

    ''' <summary>GetValueSize() : ScaleModeに従ってある単位のサイズをピクセル単位のサイズに変換して返す</summary> 
    ''' <param name="Value">変換前の単位でのサイズ</param> 
    ''' <returns>ピクセル単位のサイズ</returns> 
    ''' <remarks>内部アクセス名<para>GetValueSize()</para></remarks>
    Public Function VS(ByVal Value As SizeF) As SizeF
        Return GetValueSize(Value)
    End Function

    ''' <summary>GetValueArraySize() : ScaleModeに従ってある単位のサイズ配列をピクセル単位のサイズ配列に変換して返す</summary> 
    ''' <param name="Value">変換前の単位でのサイズ配列</param> 
    ''' <returns>ピクセル単位のサイズ配列</returns> 
    ''' <remarks>内部アクセス名<para>GetValueArraySize()</para></remarks>
    Public Function VAS(ByVal Value() As SizeF) As SizeF()
        Return GetValueArraySize(Value)
    End Function
#End Region

#Region "逆変換"
    ''' <summary>GetReverseX() : ピクセル単位での座標XをScaleModeに従ってある単位での座標Xに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の座標値</param> 
    ''' <returns>変換後の単位での座標値</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseX()</para></remarks>
    Public Function RX(ByVal Value As Single) As Single
        Return GetReverseX(Value)
    End Function

    ''' <summary>GetReverseY() : ピクセル単位での座標YをScaleModeに従ってある単位での座標Yに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の座標値</param> 
    ''' <returns>変換後の単位での座標値</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseY()</para></remarks>
    Public Function RY(ByVal Value As Single) As Single
        Return GetReverseY(Value)
    End Function

    ''' <summary>GetReverseArrayX() : ピクセル単位での座標配列XをScaleModeに従ってある単位での座標配列Xに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の座標値配列</param> 
    ''' <returns>変換後の単位での座標値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseArrayX()</para></remarks>
    Public Function RAX(ByVal Value() As Single) As Single()
        Return GetReverseArrayX(Value)
    End Function

    ''' <summary>GetReverseArrayY() : ピクセル単位での座標配列YをScaleModeに従ってある単位での座標配列Yに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の座標値配列</param> 
    ''' <returns>変換後の単位での座標値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseArrayY()</para></remarks>
    Public Function RAY(ByVal Value() As Single) As Single()
        Return GetReverseArrayY(Value)
    End Function

    ''' <summary>GetReverseValueX() : ピクセル単位の値XをScaleModeに従ってある単位の値Xに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の値</param> 
    ''' <returns>変換後の単位での値</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseValueX()</para></remarks>
    Public Function RVX(ByVal Value As Single) As Single
        Return GetReverseValueX(Value)
    End Function

    ''' <summary>GetReverseValueY() : ピクセル単位の値YをScaleModeに従ってある単位の値Yに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の値</param> 
    ''' <returns>変換後の単位での値</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseValueY()</para></remarks>
    Public Function RVY(ByVal Value As Single) As Single
        Return GetReverseValueY(Value)
    End Function

    ''' <summary>GetReverseValueArrayX() : ピクセル単位の値配列XをScaleModeに従ってある単位の値配列Xに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の値配列</param> 
    ''' <returns>変換後の単位での値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseValueArrayX()</para></remarks>
    Public Function RVAX(ByVal Value() As Single) As Single()
        Return GetReverseValueArrayX(Value)
    End Function

    ''' <summary>GetReverseValueArrayY() : ピクセル単位の値配列YをScaleModeに従ってある単位の値配列Yに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の値配列</param> 
    ''' <returns>変換後の単位での値配列</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseValueArrayY()</para></remarks>
    Public Function RVAY(ByVal Value() As Single) As Single()
        Return GetReverseValueArrayY(Value)
    End Function

    ''' <summary>GetReversePoint() : ピクセル単位での座標点をScaleModeに従ってある単位での座標点に変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の座標点</param> 
    ''' <returns>変換後の単位での座標点</returns> 
    ''' <remarks>内部アクセス名<para>GetReversePoint()</para></remarks>
    Public Function RP(ByVal Value As PointF) As PointF
        Return GetReversePoint(Value)
    End Function

    ''' <summary>GetReverseArrayPoint() : ピクセル単位での座標点配列をScaleModeに従ってある単位での座標点配列に変換して返す</summary> 
    ''' <param name="Value">ピクセル単位の座標点配列</param> 
    ''' <returns>変換後の単位での座標点配列</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseArrayPoint()</para></remarks>
    Public Function RAP(ByVal Value() As PointF) As PointF()
        Return GetReverseArrayPoint(Value)
    End Function

    ''' <summary>GetReverseValueSize() : ピクセル単位でのサイズをScaleModeに従ってある単位でのサイズに変換して返す</summary> 
    ''' <param name="Value">ピクセル単位のサイズ</param> 
    ''' <returns>変換後の単位でのサイズ</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseValueSize()</para></remarks>
    Public Function RVS(ByVal Value As SizeF) As SizeF
        Return GetReverseValueSize(Value)
    End Function

    ''' <summary>GetReverseValueArraySize() : ピクセル単位でのサイズ配列をScaleModeに従ってある単位でのサイズ配列に変換して返す</summary> 
    ''' <param name="Value">ピクセル単位のサイズ配列</param> 
    ''' <returns>変換後の単位でのサイズ配列</returns> 
    ''' <remarks>内部アクセス名<para>GetReverseValueArraySize()</para></remarks>
    Public Function RVAS(ByVal Value() As SizeF) As SizeF()
        Return GetReverseValueArraySize(Value)
    End Function
#End Region

#Region "その他の変換"
    ''' <summary>GetStepX() : 前の描画位置からの相対座標値Xを本来の座標値Xに変換して返す</summary>
    ''' <param name="Value">前の描画位置からの相対座標値</param>
    ''' <returns>本来の座標値</returns>
    ''' <remarks>内部アクセス名<para>GetStepX()</para></remarks>
    Public Function SX(ByVal Value As Single) As Single
        Return GetStepX(Value)
    End Function

    ''' <summary>GetStepY() : 前の描画位置からの相対座標値Yを本来の座標値Yに変換して返す</summary>
    ''' <param name="Value">前の描画位置からの相対座標値</param>
    ''' <returns>本来の座標値</returns>
    ''' <remarks>内部アクセス名<para>GetStepY()</para></remarks>
    Public Function SY(ByVal Value As Single) As Single
        Return GetStepY(Value)
    End Function

    ''' <summary>GetStepArrayX() : 前の描画位置からの相対座標値配列Xを本来の座標値配列Xに変換して返す</summary>
    ''' <param name="Value">前の描画位置からの相対座標値配列</param>
    ''' <returns>本来の座標値配列</returns>
    ''' <remarks>内部アクセス名<para>GetStepArrayX()</para></remarks>
    Public Function SAX(ByVal Value() As Single) As Single()
        Return GetStepArrayX(Value)
    End Function

    ''' <summary>GetStepArrayY() : 前の描画位置からの相対座標値配列Yを本来の座標値配列Yに変換して返す</summary>
    ''' <param name="Value">前の描画位置からの相対座標値配列</param>
    ''' <returns>本来の座標値配列</returns>
    ''' <remarks>内部アクセス名<para>GetStepArrayY()</para></remarks>
    Public Function SAY(ByVal Value() As Single) As Single()
        Return GetStepArrayY(Value)
    End Function

    ''' <summary>GetStepPoint() : 前の描画位置からの相対座標点を本来の座標点に変換して返す</summary>
    ''' <param name="Value">前の描画位置からの相対座標点</param>
    ''' <returns>本来の座標点</returns>
    ''' <remarks>内部アクセス名<para>GetStepPoint()</para></remarks>
    Public Function SP(ByVal Value As PointF) As PointF
        Return GetStepPoint(Value)
    End Function

    ''' <summary>GetStepArrayPoint() : 前の描画位置からの相対座標点配列を本来の座標点配列に変換して返す</summary>
    ''' <param name="Value">前の描画位置からの相対座標点配列</param>
    ''' <returns>本来の座標点配列</returns>
    ''' <remarks>内部アクセス名<para>GetStepArrayPoint()</para></remarks>
    Public Function SAP(ByVal Value() As PointF) As PointF()
        Return GetStepArrayPoint(Value)
    End Function

    ''' <summary>GetPartialArray() : ある座標値配列から指定した範囲だけを抜き出して返す</summary>
    ''' <param name="Value">基となる座標値配列</param>
    ''' <param name="Length">配列の先頭からの抜き出したい要素数</param>
    ''' <returns>抜き出した後の座標値配列</returns>
    ''' <remarks>内部アクセス名<para>GetPartialArray()</para></remarks>
    Public Function PA(ByVal Value() As Single, ByVal Length As Integer) As Single()
        Return GetPartialArray(Value, 0, Length - 1)
    End Function

    ''' <summary>GetPartialArray() : ある座標点配列から指定した範囲だけを抜き出して返す</summary>
    ''' <param name="Value">基となる座標点配列</param>
    ''' <param name="Length">配列の先頭からの抜き出したい要素数</param>
    ''' <returns>抜き出した後の座標点配列</returns>
    ''' <remarks>内部アクセス名<para>GetPartialArray()</para></remarks>
    Public Function PA(ByVal Value() As PointF, ByVal Length As Integer) As PointF()
        Return GetPartialArray(Value, 0, Length - 1)
    End Function

    ''' <summary>GetPartialArray() : あるサイズ配列から指定した範囲だけを抜き出して返す</summary>
    ''' <param name="Value">基となるサイズ配列</param>
    ''' <param name="Length">配列の先頭からの抜き出したい要素数</param>
    ''' <returns>抜き出した後のサイズ配列</returns>
    ''' <remarks>内部アクセス名<para>GetPartialArray()</para></remarks>
    Public Function PA(ByVal Value() As SizeF, ByVal Length As Integer) As SizeF()
        Return GetPartialArray(Value, 0, Length - 1)
    End Function

    ''' <summary>GetPartialArray() : ある座標値配列から指定した範囲だけを抜き出して返す</summary>
    ''' <param name="Value">基となる座標値配列</param>
    ''' <param name="StartIndex">配列の先頭からの抜き出したい最初の要素番号</param>
    ''' <param name="EndIndex">配列の先頭からの抜き出したい最後の要素番号</param>
    ''' <returns>抜き出した後の座標値配列</returns>
    ''' <remarks>内部アクセス名<para>GetPartialArray()</para></remarks>
    Public Function PA(ByVal Value() As Single, ByVal StartIndex As Integer, ByVal EndIndex As Integer) As Single()
        Return GetPartialArray(Value, StartIndex, EndIndex)
    End Function

    ''' <summary>GetPartialArray() : ある座標点配列から指定した範囲だけを抜き出して返す</summary>
    ''' <param name="Value">基となる座標点配列</param>
    ''' <param name="StartIndex">配列の先頭からの抜き出したい最初の要素番号</param>
    ''' <param name="EndIndex">配列の先頭からの抜き出したい最後の要素番号</param>
    ''' <returns>抜き出した後の座標点配列</returns>
    ''' <remarks>内部アクセス名<para>GetPartialArray()</para></remarks>
    Public Function PA(ByVal Value() As PointF, ByVal StartIndex As Integer, ByVal EndIndex As Integer) As PointF()
        Return GetPartialArray(Value, StartIndex, EndIndex)
    End Function

    ''' <summary>GetPartialArray() : あるサイズ配列から指定した範囲だけを抜き出して返す</summary>
    ''' <param name="Value">基となるサイズ配列</param>
    ''' <param name="StartIndex">配列の先頭からの抜き出したい最初の要素番号</param>
    ''' <param name="EndIndex">配列の先頭からの抜き出したい最後の要素番号</param>
    ''' <returns>抜き出した後のサイズ配列</returns>
    ''' <remarks>内部アクセス名<para>GetPartialArray()</para></remarks>
    Public Function PA(ByVal Value() As SizeF, ByVal StartIndex As Integer, ByVal EndIndex As Integer) As SizeF()
        Return GetPartialArray(Value, StartIndex, EndIndex)
    End Function
#End Region

#Region "メソッドの中身の記述"

#Region "内部通常変換"
    ''' <summary>X : ScaleModeに従ってある単位での座標Xをピクセル単位での座標Xに変換して返す</summary> 
    ''' <param name="X">変換前の単位での座標値</param> 
    ''' <returns>ピクセル単位の座標値</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetX(ByVal X As Single) As Single
        Return Me.Target.GetX(X)
    End Function

    ''' <summary>Y : ScaleModeに従ってある単位での座標Yをピクセル単位での座標Yに変換して返す</summary> 
    ''' <param name="Y">変換前の単位での座標値</param> 
    ''' <returns>ピクセル単位の座標値</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetY(ByVal Y As Single) As Single
        Return Me.Target.GetY(Y)
    End Function

    ''' <summary>AX : ScaleModeに従ってある単位での座標配列Xをピクセル単位での座標配列Xに変換して返す</summary> 
    ''' <param name="X">変換前の単位での座標値配列</param> 
    ''' <returns>ピクセル単位の座標値配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetArrayX(ByVal X As Single()) As Single()
        Return Me.Target.GetArrayX(X)
    End Function

    ''' <summary>AY : ScaleModeに従ってある単位での座標配列Yをピクセル単位での座標配列Yに変換して返す</summary> 
    ''' <param name="Y">変換前の単位での座標値配列</param> 
    ''' <returns>ピクセル単位の座標値配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetArrayY(ByVal Y As Single()) As Single()
        Return Me.Target.GetArrayY(Y)
    End Function

    ''' <summary>VX : ScaleModeに従ってある単位の値Xをピクセル単位の値Xに変換して返す</summary> 
    ''' <param name="VX">変換前の単位での値</param> 
    ''' <returns>ピクセル単位の値</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetValueX(ByVal VX As Single) As Single
        Return Me.Target.GetValueX(VX)
    End Function

    ''' <summary>VY : ScaleModeに従ってある単位の値Yをピクセル単位の値Yに変換して返す</summary> 
    ''' <param name="VY">変換前の単位での値</param> 
    ''' <returns>ピクセル単位の値</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetValueY(ByVal VY As Single) As Single
        Return Me.Target.GetValueY(VY)
    End Function

    ''' <summary>VAX : ScaleModeに従ってある単位の値配列Xをピクセル単位の値配列Xに変換して返す</summary> 
    ''' <param name="VX">変換前の単位での値配列</param> 
    ''' <returns>ピクセル単位の値配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetValueArrayX(ByVal VX As Single()) As Single()
        Return Me.Target.GetValueArrayX(VX)
    End Function

    ''' <summary>VAY : ScaleModeに従ってある単位の値配列Yをピクセル単位の値配列Yに変換して返す</summary> 
    ''' <param name="VY">変換前の単位での値配列</param> 
    ''' <returns>ピクセル単位の値配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetValueArrayY(ByVal VY As Single()) As Single()
        Return Me.Target.GetValueArrayY(VY)
    End Function

    ''' <summary>P : ScaleModeに従ってある単位の座標点をピクセル単位の座標点に変換して返す</summary> 
    ''' <param name="P">変換前の単位での座標点</param> 
    ''' <returns>ピクセル単位の座標点</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetPoint(ByVal P As PointF) As PointF
        Return Me.Target.GetPoint(P)
    End Function

    ''' <summary>AP : GetArrayPoint() : ScaleModeに従ってある単位の座標点配列をピクセル単位の座標点配列に変換して返す</summary> 
    ''' <param name="P">変換前の単位での座標点配列</param> 
    ''' <returns>ピクセル単位の座標点配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetArrayPoint(ByVal P As PointF()) As PointF()
        Return Me.Target.GetArrayPoint(P)
    End Function

    ''' <summary>VS : ScaleModeに従ってある単位のサイズをピクセル単位のサイズに変換して返す</summary> 
    ''' <param name="S">変換前の単位でのサイズ</param> 
    ''' <returns>ピクセル単位のサイズ</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetValueSize(ByVal S As SizeF) As SizeF
        Return Me.Target.GetValueSize(S)
    End Function

    ''' <summary>VAS : ScaleModeに従ってある単位のサイズ配列をピクセル単位のサイズ配列に変換して返す</summary> 
    ''' <param name="S">変換前の単位でのサイズ配列</param> 
    ''' <returns>ピクセル単位のサイズ配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetValueArraySize(ByVal S As SizeF()) As SizeF()
        Return Me.Target.GetValueArraySize(S)
    End Function
#End Region

#Region "内部逆変換"
    ''' <summary>RX : ピクセル単位での座標XをScaleModeに従ってある単位での座標Xに変換して返す</summary> 
    ''' <param name="X">ピクセル単位の座標値</param> 
    ''' <returns>変換後の単位での座標値</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetReverseX(ByVal X As Single) As Single
        Return Me.Target.GetReverseX(X)
    End Function

    ''' <summary>RY : ピクセル単位での座標YをScaleModeに従ってある単位での座標Yに変換して返す</summary> 
    ''' <param name="Y">ピクセル単位の座標値</param> 
    ''' <returns>変換後の単位での座標値</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetReverseY(ByVal Y As Single) As Single
        Return Me.Target.GetReverseY(Y)
    End Function

    ''' <summary>RAX : ピクセル単位での座標配列XをScaleModeに従ってある単位での座標配列Xに変換して返す</summary> 
    ''' <param name="X">ピクセル単位の座標値配列</param> 
    ''' <returns>変換後の単位での座標値配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetReverseArrayX(ByVal X As Single()) As Single()
        Return Me.Target.GetReverseArrayX(X)
    End Function

    ''' <summary>RAY : ピクセル単位での座標配列YをScaleModeに従ってある単位での座標配列Yに変換して返す</summary> 
    ''' <param name="Y">ピクセル単位の座標値配列</param> 
    ''' <returns>変換後の単位での座標値配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetReverseArrayY(ByVal Y As Single()) As Single()
        Return Me.Target.GetReverseArrayY(Y)
    End Function

    ''' <summary>RVX : ピクセル単位の値XをScaleModeに従ってある単位の値Xに変換して返す</summary> 
    ''' <param name="VX">ピクセル単位の値</param> 
    ''' <returns>変換後の単位での値</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetReverseValueX(ByVal VX As Single) As Single
        Return Me.Target.GetReverseValueX(VX)
    End Function

    ''' <summary>RVY : ピクセル単位の値YをScaleModeに従ってある単位の値Yに変換して返す</summary> 
    ''' <param name="VY">ピクセル単位の値</param> 
    ''' <returns>変換後の単位での値</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetReverseValueY(ByVal VY As Single) As Single
        Return Me.Target.GetReverseValueY(VY)
    End Function

    ''' <summary>RVAX : ピクセル単位の値配列XをScaleModeに従ってある単位の値配列Xに変換して返す</summary> 
    ''' <param name="VX">ピクセル単位の値配列</param> 
    ''' <returns>変換後の単位での値配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetReverseValueArrayX(ByVal VX As Single()) As Single()
        Return Me.Target.GetReverseValueArrayX(VX)
    End Function

    ''' <summary>RVAY : ピクセル単位の値配列YをScaleModeに従ってある単位の値配列Yに変換して返す</summary> 
    ''' <param name="VY">ピクセル単位の値配列</param> 
    ''' <returns>変換後の単位での値配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetReverseValueArrayY(ByVal VY As Single()) As Single()
        Return Me.Target.GetReverseValueArrayY(VY)
    End Function

    ''' <summary>RP : ピクセル単位での座標点をScaleModeに従ってある単位での座標点に変換して返す</summary> 
    ''' <param name="P">ピクセル単位の座標点</param> 
    ''' <returns>変換後の単位での座標点</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetReversePoint(ByVal P As PointF) As PointF
        Return Me.Target.GetReversePoint(P)
    End Function

    ''' <summary>RAP : ピクセル単位での座標点配列をScaleModeに従ってある単位での座標点配列に変換して返す</summary> 
    ''' <param name="P">ピクセル単位の座標点配列</param> 
    ''' <returns>変換後の単位での座標点配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetReverseArrayPoint(ByVal P As PointF()) As PointF()
        Return Me.Target.GetReverseArrayPoint(P)
    End Function

    ''' <summary>RVS : ピクセル単位でのサイズをScaleModeに従ってある単位でのサイズに変換して返す</summary> 
    ''' <param name="S">ピクセル単位のサイズ</param> 
    ''' <returns>変換後の単位でのサイズ</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetReverseValueSize(ByVal S As SizeF) As SizeF
        Return Me.Target.GetReverseValueSize(S)
    End Function

    ''' <summary>RVAS : ピクセル単位でのサイズ配列をScaleModeに従ってある単位でのサイズ配列に変換して返す</summary> 
    ''' <param name="S">ピクセル単位のサイズ配列</param> 
    ''' <returns>変換後の単位でのサイズ配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetReverseValueArraySize(ByVal S As SizeF()) As SizeF()
        Return Me.Target.GetReverseValueArraySize(S)
    End Function
#End Region

#Region "内部その他の変換"
    ''' <summary>SX : 前の描画位置からの相対座標値Xを本来の座標値Xに変換して返す</summary> 
    ''' <param name="X">前の描画位置からの相対座標値</param> 
    ''' <returns>本来の座標値</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetStepX(ByVal X As Single) As Single
        Return Me.Target.GetStepX(X)
    End Function

    ''' <summary>SY : 前の描画位置からの相対座標値Yを本来の座標値Yに変換して返す</summary> 
    ''' <param name="Y">前の描画位置からの相対座標値</param> 
    ''' <returns>本来の座標値</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetStepY(ByVal Y As Single) As Single
        Return Me.Target.GetStepY(Y)
    End Function

    ''' <summary>SAX : 前の描画位置からの相対座標値配列Xを本来の座標値配列Xに変換して返す</summary> 
    ''' <param name="X">前の描画位置からの相対座標値配列</param> 
    ''' <returns>本来の座標値配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetStepArrayX(ByVal X As Single()) As Single()
        Return Me.Target.GetStepArrayX(X)
    End Function

    ''' <summary>SAY : 前の描画位置からの相対座標値配列Yを本来の座標値配列Yに変換して返す</summary> 
    ''' <param name="Y">前の描画位置からの相対座標値配列</param> 
    ''' <returns>本来の座標値配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetStepArrayY(ByVal Y As Single()) As Single()
        Return Me.Target.GetStepArrayY(Y)
    End Function

    ''' <summary>SP : 前の描画位置からの相対座標点を本来の座標点に変換して返す</summary> 
    ''' <param name="P">前の描画位置からの相対座標点</param> 
    ''' <returns>本来の座標点</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetStepPoint(ByVal P As PointF) As PointF
        Return Me.Target.GetStepPoint(P)
    End Function

    ''' <summary>SAP : 前の描画位置からの相対座標点配列を本来の座標点配列に変換して返す</summary> 
    ''' <param name="P">前の描画位置からの相対座標点配列</param> 
    ''' <returns>本来の座標点配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetStepArrayPoint(ByVal P As PointF()) As PointF()
        Return Me.Target.GetStepArrayPoint(P)
    End Function

    ''' <summary>PA : ある座標値配列から指定した範囲だけを抜き出して返す</summary> 
    ''' <param name="Value">基となる座標値配列</param> 
    ''' <param name="StartIndex">配列の先頭からの抜き出したい最初の要素番号</param> 
    ''' <param name="EndIndex">配列の先頭からの抜き出したい最後の要素番号</param> 
    ''' <returns>抜き出した後の座標値配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetPartialArray(ByVal Value As Single(), ByVal StartIndex As Integer, ByVal EndIndex As Integer) As Single()
        Return Me.Target.GetPartialArray(Value, StartIndex, EndIndex)
    End Function

    ''' <summary>PA : ある座標点配列から指定した範囲だけを抜き出して返す</summary> 
    ''' <param name="Value">基となる座標点配列</param> 
    ''' <param name="StartIndex">配列の先頭からの抜き出したい最初の要素番号</param> 
    ''' <param name="EndIndex">配列の先頭からの抜き出したい最後の要素番号</param> 
    ''' <returns>抜き出した後の座標点配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetPartialArray(ByVal Value As PointF(), ByVal StartIndex As Integer, ByVal EndIndex As Integer) As PointF()
        Return Me.Target.GetPartialArray(Value, StartIndex, EndIndex)
    End Function

    ''' <summary>PA : あるサイズ配列から指定した範囲だけを抜き出して返す</summary> 
    ''' <param name="Value">基となるサイズ配列</param> 
    ''' <param name="StartIndex">配列の先頭からの抜き出したい最初の要素番号</param> 
    ''' <param name="EndIndex">配列の先頭からの抜き出したい最後の要素番号</param> 
    ''' <returns>抜き出した後のサイズ配列</returns> 
    <EditorBrowsable(EBState)> _
    Public Function GetPartialArray(ByVal Value As SizeF(), ByVal StartIndex As Integer, ByVal EndIndex As Integer) As SizeF()
        Return Me.Target.GetPartialArray(Value, StartIndex, EndIndex)
    End Function
#End Region

#End Region

#End Region

End Class
#End Region
